Batch file Windows环境变量值中的引号

Batch file Windows环境变量值中的引号,batch-file,path,pipe,environment-variables,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

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

和/或


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

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

以下是任务的批处理代码示例:

@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

请参阅上的答案以及此处引用的其他答案,为什么即使要分配给变量的值本身包含一个或多个引号,也应使用
设置“variable=value”

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

setlocal EnableDelayedExpansion
set x="
echo !x!
echo !x! | more
echo !path! | more
为了安全起见,也可以使用
echo(


还有一个关于

的问题,我想一个解决方案是编写一个单独的批处理文件,名为
echopath.bat
,其中包含一行
@echo%PATH%
,然后将其调用为
@call echopath | findstr…
,但如果可能的话,我希望将所有解决方案都保存在一个文件中。您的应用程序是否需要要加前缀的目录?如果它不在路径中,它可以加前缀吗?@Magoo“如果它不在路径中,它可以加前缀吗?”啊,在最初的混乱之后,我明白了。你的意思是“如果它在路径中的任何地方,不一定在开始时”"不,它需要在开头。
%PATH%
可能而且经常包含多个
C:\PythonXX
目录,我想确保我选择的目录被提升到最前面,因此在我键入
python.exe
时保证可以访问。另请参见它是关于如何替换现有的python路径通过系统路径中的另一个Python路径,该路径可以根据您的任务要求进行扩展。有时,路径必须包含引号。例如,
“C:\Music;Audio”
在目录名中包含分号。因此路径包含
path=C:\windows\system32;“C:\Music;Audio”
是的,没错。存在此异常。我认为不允许在目录名中使用分号的目录路径,因为实际上根本没有理由在目录名中使用分号。但是,路径中的奇数引号需要人工更正,或者脚本尝试找出缺失的位置应该通过验证路径中的哪些目录确实存在来在路径中插入引号。在中的
var
示例中删除其中一个引号说明了这个问题。嗯,我同意它不应该存在,在任何理智的世界中,但我希望它不幸存在。谁知道,如果pathlo逻辑命名的dirs?我曾考虑过substring方法,不幸的是,我提升到路径开头的dir可能并不总是有11个字符(
c:\PythonXX
只是一个示例)所以硬编码的12是一个问题。我在寻找批量查找字符串长度的方法,它们非常可怕。整个解决方案似乎越来越麻烦。@jez如果需要获取变量字符串的长度,请查看批处理函数。谢谢,我想我可以使用它。理想情况下,我想如果我的目标目录已经存在,请从
%PATH%
中删除它们,并将它们移到前面,但正如您对拆分问题的回答所示,在存在
和/或
%PATH%
中。阅读了该答案后,我现在不确定问题计算机的名称中是否有带有
的目录,或者名称中带有
的目录,这些目录随后被引用以避免解释为路径分隔符。
echo(!path! | more