我正在尝试在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)有没有办法有条件地将目录添加到系统路径中以避免这种混乱?
答案 0 :(得分:3)
使用延迟扩展以安全的方式回显任何变量内容。
setlocal EnableDelayedExpansion
set x="
echo !x!
echo !x! | more
echo !path! | more
为了安全起见,使用空变量也可以使用echo(
echo(!path! | more
的问题
答案 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"
。