在 Windows 批处理文件中将反斜杠更改为正斜杠

Posted

技术标签:

【中文标题】在 Windows 批处理文件中将反斜杠更改为正斜杠【英文标题】:Change backslash to forward slash in windows batch file 【发布时间】:2014-06-25 21:15:18 【问题描述】:

我正在尝试将包含文件名和位置的变量中的所有反斜杠 () 转换为正斜杠 (/)。我已经阅读并看到了:

%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:\=/%"

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

【问题讨论】:

对不起,你是对的。我的意思是BATCH - Replacing spaces in filename with %20 for curl 【参考方案1】:

这似乎对我有用:

echo off

setlocal enabledelayedexpansion

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

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

【讨论】:

【参考方案2】:

在块语句(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%% 的使用,它显示var 的更改值。

您的代码包含两个单独的变量,称为 f

第一个是称为f 并由%%f 引用的循环控制“元变量”。

第二个是公共环境变量f,由set "f=..."语句建立。这个变量可以通过在block 中使用%f% 但是 来访问,它似乎保留了它在解析控制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

这会以所需的方式设置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没有特殊意义的字符。

【讨论】:

哇,非常全面的解释,非常感谢!我不得不读了几次,但我想我明白了..!! Windows 批处理脚本对我来说仍然看起来很奇怪,我不确定我是否真的会“得到它” 我实际上不得不做相反的事情:用反斜杠替换正斜杠,但你的解释很完美。 如何直接在控制台中做同样的事情?【参考方案3】:

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

set "variable=E:\myfiles\app1\data\*.csv"
set "variable=%variable:\=/%"
echo "%variable%"

【讨论】:

这个答案工作得很好,不需要循环。我自己试过了(不过我不需要引号)。 感谢@ThePersonWithoutC - 引号保护了某些有毒字符,例如&,只是让它在奇怪的情况下更加健壮。 谢谢,这里最好的解决方案 如何直接在控制台中做同样的事情?【参考方案4】:

这将适用于在窗口中将反斜杠更改为正斜杠:

 typedef std::basic_string<TCHAR> tstring;
 tstring pathbasic = tstring(programdata) + _T("\\myfile.txt");
 std::replace(pathbasic.begin(), pathbasic.end(), _T('\\'), _T('/'));

【讨论】:

这个答案与批处理文件无关【参考方案5】:

Magoo's helpful answer 展示了如何在 for 循环的 (...) 块内执行动态替换(通过延迟扩展)。

foxidrive's answer 显示了用于在变量值中执行文字、全局字符串替换的一般 cmd 语法(也在问题中简要显示)。

让我用一个使用PowerShell's CLI的解决方案来补充这些答案:

注意:

在手头的简单情况下,这太过分了,而且性能也比纯 cmd 解决方案差。

但是,如果您需要更复杂的、基于正则表达式的字符串替换,通过 PowerShell 的基于正则表达式的-replace 运算符,该技术可能会有所帮助。

@echo off

:: Sample path.
Set inPath=C:\foo\bar

for /f "usebackq delims=" %%i in (
  `powershell -noprofile -c "\"%inPath%\" -replace '\\', '/'"`
) do set "outPath=%%i"

echo %outPath%

以上产量:

C:/foo/bar

内联变体,输入路径直接嵌入,转换后的字符串直接输出:

C:\>powershell -noprofile -c "\"C:\foo\bar\" -replace '\\', '/'"
C:/foo/bar

【讨论】:

以上是关于在 Windows 批处理文件中将反斜杠更改为正斜杠的主要内容,如果未能解决你的问题,请参考以下文章

如何将 \\ 更改为 \

在R中有效地将反斜杠转换为正斜杠

将反斜杠更改为双反斜杠

python中将反斜杠'\'变为正斜杠'/'

Linux中的正斜杆(/)和反斜杆(\)的作用

路径转换工具v0.1