在 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 批处理文件中将反斜杠更改为正斜杠的主要内容,如果未能解决你的问题,请参考以下文章