Windows 环境变量值中的引号

quotes in Windows environment variable value

我正在尝试在 Windows 批处理文件中实现逻辑 "if %MyBinaryDir% is not already at the beginning of the system %PATH%, then put it there; if it's already there, do nothing"。

我知道了:

@echo %PATH% | findstr /i /b /c:"%MyBinaryDir%;" > nul || set "PATH=%MyBinaryDir%;%PATH%

这一直工作得很好,直到 我试图在某人的机器上部署,但出于某种神秘的原因 %PATH% 变量包含奇数个引号字符。

问题归结为:

@set x="
@echo %x%
@echo %x% | more

第二行打印单个 " 字符。第三行被引号字符绊倒,根本无法将 echo 输出通过管道传输到第二个二进制文件(在我的例子中是 findstr,但在这个简化的例子中是 more) .相反,它从字面上打印字符:

" | more

所以我的问题是:

(Y) 如何安全地将 any 任意字符串传输到第二个二进制文件?

and/or

(X) 有没有一种方法可以有条件地将目录添加到系统路径中来避免这种混乱?

我建议清理 PATH,因为此环境变量中的任何目录路径都不应包含引号。

这是您的任务的示例批处理代码:

@echo off
rem Uncomment the line below for testing with C:\PythonXX
rem already in PATH with an erroneous double quote in PATH.
rem set "PATH=C:\PythonXX;"%PATH%"

echo Path before clean up:
echo.
echo PATH=%PATH%
set "PATH=%PATH:"=%"
echo.
echo Path after clean up:
echo.
echo PATH=%PATH%
if /I "%PATH:~0,12%" NEQ "C:\PythonXX;" set "PATH=C:\PythonXX;%PATH%"
echo.
echo Path modified:
echo.
echo PATH=%PATH%
echo.
pause

查看 上的答案以及那里引用的其他答案,为什么即使分配给变量的值本身包含 1 个或多个引号,也应使用 set "variable=value"

使用延迟扩展以安全的方式回显任何变量内容。

setlocal EnableDelayedExpansion
set x="
echo !x!
echo !x! | more
echo !path! | more

为了安全起见,您也可以使用空变量 echo(

echo(!path! | more

还有一个关于pretty print/split the path variable

的问题