windows 批处理。检查变量中的子字符串时出错。需要转义空格

windows 批处理。检查变量中的子字符串时出错。需要转义空格

https://stackoverflow.com/questions/7005951/batch-file-find-if-substring-is-in-string-not-in-a-file,我知道如何检查 PATH 变量是否具有特定子字符串(groovy 的路径)。但是,我的 PATH 变量中有空格,这会导致错误“Files\Amazon这时才出乎意料。“。

set str1=%PATH%
rem set str1=C:\lang\groovy-2.4.21\bin
rem set str1=foo
if not x%str1:groovy-2.4.21=%==x%str1% goto noNeedToAddGroovy
echo "Groovy is not in the path. Add groovy to the path"
SET "PATH=C:\lang\groovy-2.4.21\bin;%PATH%;
endlocal

在上面的代码块中,下面一行

if not x%str1:groovy-2.4.21=%==x%str1% goto noNeedToAddGroovy

给出错误“Files\Amazon这时“。

我怎样才能正确地转义 str1 变量中的空格?

答案1

您只需在两边添加引号即可。

if not x%str1:groovy-2.4.21=%==x%str1% goto noNeedToAddGroovy

变成

if not "x%str1:groovy-2.4.21=%"=="x%str1%" goto noNeedToAddGroovy

那么为什么这会起作用呢?

IF 语句将检查 == 左边的所有内容并将其与 == 右边的所有内容进行比较。

因此,写入BLA%1BLA==BLAtestBLA将测试 %1 是否与测试相同,因为 BLA 部分存在于 == 的两边。

通过使用引号,它可以测试“xxx”==“yyy”,这与 xxx==yyy 相同。

但在脚本中,所有用空格分隔的元素都被视为参数。如果你用引号括起来,引号内的元素都被视为一个参数。

所以是的,它确实与两边的引号进行了比较,但考虑到比较并不重要,它是有效的,并且引号基本上是这样,因此您不需要转义字符串并使事情变得不必要地复杂。

相关内容