Windows环境变量值中的引号

时间:2016-01-08 05:10:25

标签: batch-file path pipe environment-variables

我正在尝试在Windows批处理文件中实现逻辑“如果%MyBinaryDir%尚未在系统的开头%PATH%,则将其放在那里;如果它已经存在,什么都不做“。

我有这个:

@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)如何安全地将任意任意字符串传输到第二个二进制文件中?

和/或

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

2 个答案:

答案 0 :(得分:3)

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

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

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

echo(!path! | more

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

的问题

答案 1 :(得分:0)

我建议清理 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

请参阅set environment variables with spaces上的答案以及其中引用的其他答案,即使分配给变量的值本身包含1个或更多引号,也应使用set "variable=value"