在Windows批处理文件中更改反斜杠以转发斜杠

use*_*319 25 windows string batch-file slash

我正在尝试将所有反斜杠()转换为包含文件名和位置的变量中的正斜杠(/).我读过这个并看到过:

%variable:str1=str2%
Run Code Online (Sandbox Code Playgroud)

set "var=%var:\=/%"
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的,但我显然没有把它弄好.

这是我的.bat脚本的相关部分:

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

输出显示每个文件名列出两次.

即这一行:

set "f=f:\=/%"
Run Code Online (Sandbox Code Playgroud)

没有做我想做的事.谁能看到我做错了什么?

fox*_*ive 64

这会将反斜杠更改为变量中的正斜杠:

set "variable=E:\myfiles\app1\data\*.csv"
set "variable=%variable:\=/%"
echo "%variable%"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@ThePersonWithoutC - 引号保护某些毒性字符,如`&`,只是让它在奇怪的情况下更健壮. (4认同)
  • 谢谢,这里最好的解决方案 (3认同)
  • 这个答案完全正常,无需循环.我自己尝试过(我不需要引号). (2认同)

Mag*_*goo 20

在块语句中(a parenthesised series of statements),整个块被解析然后执行.%var%块中的任何内容都将被解析块时的变量值替换- 在块执行之前 - 同样的事情适用于a FOR ... DO (block).

因此,IF (something) else (somethingelse)将使用遇到%variables%时的值来执行IF.

克服这个问题的两种常用方法是1)使用setlocal enabledelayedexpansion和使用!var!代替%var%访问改变的值var或2)调用子程序以使用改变的值执行进一步处理.

因此请注意其使用CALL ECHO %%var%%显示更改后的值var.

您的代码包含两个单独的变量f.

第一个是被称为f和引用的循环控制"元变量" %%f.

第二个是fset "f=..."语句建立的公共环境变量.此变量可以通过使用被访问%f% 内的block,它会出现保留它有当控制值for被解析(事实上,任何%var%通过的值替换在分析时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
Run Code Online (Sandbox Code Playgroud)

这会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
Run Code Online (Sandbox Code Playgroud)

区别在于使用call和加倍%s,最后一行将显示!f!为 - 文字,因为在delayedexpansion模式之外,!只是另一个没有特殊含义的字符cmd.


小智 5

这似乎为我工作:

echo off

setlocal enabledelayedexpansion

FOR %%f IN ("C:\tools\workspace\*") DO (
  set old=%%f
  echo !old!
  set new=!old:\=/!
  echo !new!  
  echo.                 
)
Run Code Online (Sandbox Code Playgroud)

使用单独的变量而不是循环变量会有所不同,并启用延迟扩展,因为使用循环变量%% f的变量替换语法似乎无效。