我试图将所有反斜杠()转换为包含文件名和位置的variables中的正斜杠(/)。 我读过关于这个,看到:
%variable:str1=str2%
和
set "var=%var:\=/%"
我尝试过,但我显然没有得到正确的。
这里是我的.bat脚本的相关部分:
FOR %%f IN ("E:\myfiles\app1\data\*.csv") DO ( echo %%f set "f=%%f:\=/%" echo %%f echo. )
输出显示每个文件名列出两次。
即这一行:
set "f=f:\=/%"
没有做我想做的事情。 任何人都可以看到我做错了什么?
在块语句(a parenthesised series of statements)
, 整个块被解析并执行。 块中的任何%var%
将被该块被解析时该变量的值替换 – 在块被执行之前 – 同样的事情适用于FOR ... DO (block)
。
因此, IF (something) else (somethingelse)
将在遇到IF
时使用%variables%
的值执行。
解决这个问题的两种常用方法是1)使用setlocal enabledelayedexpansion
并使用!var!
代替%var%
来访问%var%
的变化值,或者2)调用一个子程序来使用改变后的值执行进一步的处理。
因此请注意使用CALL ECHO %%var%%
显示CALL ECHO %%var%%
的变化值。
你的代码包含两个独立的变量f
。
第一个是被称为f
的循环控制“元变量”,由%%f
引用。
第二个是通过set "f=..."
语句建立的公共环境变量f
。 这个变量可以通过使用%f%
来访问, 但是在一个block
,它会保留它在解析控制时的值(实际上,任何%var%
在parse-time被替换为var
那个时候 )
metavariables
不能用于字符串操作语句(如子字符串或替换字符串)中,只有通用的环境变量才能用于这些操作,因此需要将元变量f
的值赋值给环境变量f
, 然后执行字符串替换任务环境变量f
。
当然,扭曲是你必须使用delayedexpansion
和!var!
语法来访问块内环境变量的修改值。
所以,
setlocal enabledelayedexpansion for...%%f...do ( echo %%f set "f=%%f" set "f=!f:\=/!" echo !f! ) echo just for demonstration %f% !f! %%f
这以所需的方式设置f
的值(当然,您可以随时更改名称以避免混淆…)
最后一行只是简单地表明f
所获得的最终值可以在循环之外被访问为%f%
或!f!
,并且%%f
不在上下文中,并显示为%f
。
另一种方法做这个没有delayedexpansion
是
for...%%f...do ( echo %%f set "f=%%f" call set "f=%%f:\=/%%" call echo %%f%% ) echo just for demonstration %f% !f! %%f
不同的是使用call
和加倍%
s,最后一行将显示!f!
就像这样 – 一个文字,因为在delayedexpansion
模式之外, !
是对cmd
没有特殊含义的另一个字符。
这将在一个变量中将反斜杠改为正斜杠:
set "variable=E:\myfiles\app1\data\*.csv" set "variable=%variable:\=/%" echo "%variable%"
这似乎为我工作:
echo off setlocal enabledelayedexpansion FOR %%f IN ("C:\tools\workspace\*") DO ( set old=%%f echo !old! set new=!old:\=/! echo !new! echo. )
使用单独的变量而不是循环变量会产生差异,同时启用延迟扩展,因为使用循环变量%% f dosn't的变量替代syntex似乎可行。