更改反斜杠在Windowsbatch file中转发斜杠

我试图将所有反斜杠()转换为包含文件名和位置的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似乎可行。