windows - 为什么 windows shell 的 for 命令会替换分号?

标签 windows shell batch-file cmd

我正在尝试编写一个小脚本来替换 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/

相关文章:

windows - 在 GNU 的 bash 中更改目录

windows - 如何在 HH :29:55 and HH:59:55 in a windows batch file 触发命令

python - 防止意外的标准输入读取并锁定子进程

c++ - 我的源字符串采用哪种编码?

Java屏幕共享程序

windows - 尝试使用 powershell 将日志文件的最后 10 行连接到批处理变量

string - 如何在特定单词后剪切字符串?

batch-file - 使用批处理脚本检测 USB 并将 *.* 复制到 USB 驱动器

ruby - 如何从 Capistrano 中的远程命令捕获输出?

c - getenv() 将环境返回为 null?