我试图将所有反斜杠()转换为包含文件名和位置的变量中的正斜杠(/)。我已经读到了这个并看到了:
%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:\=/%"
没有按照我的意愿行事。谁能看到我做错了什么?
答案 0 :(得分:55)
这会将变量的反斜杠更改为正斜杠:
set "variable=E:\myfiles\app1\data\*.csv"
set "variable=%variable:\=/%"
echo "%variable%"
答案 1 :(得分:20)
在块语句(a parenthesised series of statements)
中,解析整个块并执行然后。块中的任何%var%
将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于{{1 }}
因此,FOR ... DO (block)
将在遇到IF (something) else (somethingelse)
时使用%variables%
的值执行。
解决此问题的两种常见方法是1)使用IF
并使用setlocal enabledelayedexpansion
代替!var!
来访问已更改的%var%
或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。
请注意使用var
显示CALL ECHO %%var%%
。
您的代码包含两个名为var
的独立变量。
第一个是循环控制'元变量'名为f
,由f
引用。
第二个是由%%f
语句建立的公共环境变量f
。可以使用set "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
的值(当然,您可以随时更改名称以避免混淆......)
最后一行只是为了表明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
并将%
加倍,最后一行将!f!
显示为 - delayedexpansion
以外的!
模式,cmd
只是另一个对{{1}}没有特殊含义的字符。
答案 2 :(得分:4)
这似乎对我有用:
echo off
setlocal enabledelayedexpansion
FOR %%f IN ("C:\tools\workspace\*") DO (
set old=%%f
echo !old!
set new=!old:\=/!
echo !new!
echo.
)
使用单独的变量而不是循环变量会产生差异,同时启用延迟扩展,因为变量替换syntex使用循环变量%% f dos似乎不起作用。
答案 3 :(得分:0)
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
答案 4 :(得分:-1)
这将适用于将反斜杠更改为Windows中的正斜杠:
typedef std::basic_string<TCHAR> tstring;
tstring pathbasic = tstring(programdata) + _T("\\myfile.txt");
std::replace(pathbasic.begin(), pathbasic.end(), _T('\\'), _T('/'));