Koo*_*laa 3 windows shell cmd batch-file
我正在尝试编写一个小脚本来替换 Windows 路径中的值。使用一些 sed 来替换它很好(我有正确的变量):
echo %path% | sed "s/jvms\\[^^\]\+/jvms\\%1/"
Run Code Online (Sandbox Code Playgroud)
这工作正常。但是,我想将它分配给一个新的路径变量。这样做的方法应该是
for /f "delims=" %%B in ('echo %path% ^| sed "s/windows/C64/"' ) do call set replaced=%%B
echo %replaced%
Run Code Online (Sandbox Code Playgroud)
请注意 | 应该逃脱。但是,新replaced变量将所有分号都替换为空格。因此,输出echo %replaced%类似于c:\C64 c:\program files c:\otherdirectory而不是c:\C64;c:\program files;c:\otherdirectory
当我不使用任何 sed 时,这已经发生了,所以
for /f "delims=" %%B in ('echo %path%' ) do call set replaced=%%B
echo %replaced%
Run Code Online (Sandbox Code Playgroud)
然后返回 c:\Windows c:\program files c:\otherdirectory
如何确保分号不被空格替换?
该cmd解析器认为分号(以及逗号,等号和制表符)作为标记分离器。该for /f命令经过一轮解析,其中分隔符替换为空格。例如,for /f "delims=" %%B in ('echo a;b==c,,,d') do echo %%B结果为a b c d。
避免替换的一种方法是引用参数,然后取消引用%%~B标记。对于第二个示例,for /f "delims=" %%B in ('echo "%path%"' ) do set "replaced=%%~B"将按预期工作。