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?
This will change the back-slashes to forward-slashes in a variable:
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 aFOR ... DO (block)
.Hence,
IF (something) else (somethingelse)
will be executed using the values of%variables%
at the time theIF
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 ofvar
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 ofvar
.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 theset "f=..."
statement. This variable can be accessed by using%f%
but within ablock
, it will appear to retain the value it had when the controllingfor
was parsed (in fact, any%var%
is replaced at parse-time by the value ofvar
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 metavariablef
to the environment variablef
and then perform the string-substitution task of the environment variablef
.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,
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
isthe difference being the use of
call
and doubling the%
s, and the final line will show!f!
as just that - a literal, since outside ofdelayedexpansion
mode,!
is just another character with no special meaning tocmd
.This seems to work for me:
Using a seperate variable rather than the loop variable makes the difference, along with enabling delayed expansion as the variable substittion syntex using the loop variable %%f dosn't seem to work.