Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change backslash to forward slash in windows batch file

I'm trying to convert all backslashes () to forward slashes (/) in a variable which contains a file name and location. I've read about this and seen:

%variable:str1=str2% 

and

set "var=%var:\=/%" 

which I've attempted, but I'm obviously not getting it right.

Here is the relevant section of my .bat script:

FOR %%f IN ("E:\myfiles\app1\data\*.csv") DO (   echo %%f     set "f=%%f:\=/%"   echo %%f     echo.                  ) 

The output show each filename listed twice.

i.e. this line:

set "f=f:\=/%" 

is not doing what I want it to. Can anyone see what I am doing wrong?

like image 870
user3253319 Avatar asked May 08 '14 12:05

user3253319


People also ask

How do I change backslash to forward slash in Windows?

Press \/ to change every backslash to a forward slash, in the current line. Press \\ to change every forward slash to a backslash, in the current line.

What is %1 in a batch file?

When used in a command line, script, or batch file, %1 is used to represent a variable or matched string. For example, in a Microsoft batch file, %1 can print what is entered after the batch file name.

What does %% mean in batch script?

Represents a replaceable parameter. Use a single percent sign ( % ) to carry out the for command at the command prompt. Use double percent signs ( %% ) to carry out the for command within a batch file. Variables are case sensitive, and they must be represented with an alphabetical value such as %a, %b, or %c. ( <set> )

How do I modify a batch file?

Edit a batch file from within Windows Batch files are plain-text files, which means they can be edited as a text file by right-clicking the file and clicking Edit as shown in the picture. Once you've clicked edit, your default text editor opens the file and allows it to be modified.


2 Answers

This will change the back-slashes to forward-slashes in a variable:

set "variable=E:\myfiles\app1\data\*.csv" set "variable=%variable:\=/%" echo "%variable%" 
like image 99
foxidrive Avatar answered Sep 21 '22 18:09

foxidrive


Within a block statement (a parenthesised series of statements), the entire block is parsed and then executed. Any %var% within the block will be replaced by that variable's value at the time the block is parsed - before the block is executed - the same thing applies to a FOR ... DO (block).

Hence, IF (something) else (somethingelse) will be executed using the values of %variables% at the time the IF is encountered.

Two common ways to overcome this are 1) to use setlocal enabledelayedexpansion and use !var! in place of %var% to access the changed value of var or 2) to call a subroutine to perform further processing using the changed values.

Note therefore the use of CALL ECHO %%var%% which displays the changed value of var.

Your code contains two separate variables called f.

The first is the loop-control 'metavariable' called f and referenced by %%f.

The second is the common environment variable f which is established by the set "f=..." statement. This variable can be accessed by using %f% but within a block, it will appear to retain the value it had when the controlling for was parsed (in fact, any %var% is replaced at parse-time by the value of var at that time)

metavariables cannot be used in string-manipulation statements like substrings or substitutes, only common environment variables can be used for these operations, hence you need to assign the value of the metavariable f to the environment variable f and then perform the string-substitution task of the environment variable f.

The twist, of course, is that you must use delayedexpansion and the !var! syntax to access the modified value of an environment variable within a block.

So,

setlocal enabledelayedexpansion for...%%f...do (   echo %%f   set "f=%%f"   set "f=!f:\=/!"   echo !f! ) echo just for demonstration %f% !f! %%f 

This sets the value of f in the required manner (of course, you could always change the name to avoid confusion...)

The last line is simply to show that the final value acquired by f can be accessed outside of the loop as either %f% or !f!, and that %%f is out-of-context and shown as %f.

Another way to do this without delayedexpansion is

for...%%f...do (   echo %%f   set "f=%%f"   call set "f=%%f:\=/%%"   call echo %%f%% ) echo just for demonstration %f% !f! %%f 

the difference being the use of call and doubling the %s, and the final line will show !f! as just that - a literal, since outside of delayedexpansion mode, ! is just another character with no special meaning to cmd.

like image 29
Magoo Avatar answered Sep 21 '22 18:09

Magoo