我正在尝试编写一个小脚本来替换 Windows 路径中的值。 使用一些 sed 来替换它很好(我有正确的变量):
echo %path% | sed "s/jvms\\[^^\]\+/jvms\\%1/"
这很好用。但是,我想将它分配给一个新的路径变量。这样做的方法应该是
for /f "delims=" %%B in ('echo %path% ^| sed "s/windows/C64/"' ) do call set replaced=%%B
echo %replaced%
请注意 |被转义了。但是,新的 replaced
变量将所有分号替换为空格。因此,echo %replaced%
的输出类似于 c:\C64 c:\program files c:\otherdirectory
而不是 c:\C64;c :\程序文件;c:\其他目录
当我不使用任何 sed 时,这已经发生了,所以
for /f "delims=" %%B in ('echo %path%' ) do call set replaced=%%B
echo %replaced%
然后返回 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
token 。对于第二个示例,for /f "delims=" %%B in ('echo "%path%"' ) do set "replaced=%%~B"
将按预期工作。
关于windows - 为什么 windows shell 的 for 命令会替换分号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67375668/