【问题标题】:quotes in Windows environment variable valueWindows 环境变量值中的引号
【发布时间】:2016-04-12 17:09:19
【问题描述】:

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

和/或

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

【问题讨论】:

  • 我想一种解决方案是编写一个名为echopath.bat 的单独批处理文件,其中包含单行@echo %PATH%,然后将其调用为@call echopath | findstr ... 但我想将解决方案全部保留在如果可能,一个文件。
  • 您的应用程序是否需要要添加的目录?如果它不在路径中,是否可以简单地添加它?
  • @Magoo “如果它不在路径中,是否可以简单地添加它?”啊,经过最初的困惑,我明白了。您的意思是“如果它在路径中的 anywhere 中,不一定在开头”。不,它必须在开头。 %PATH% 可能并且经常确实包含多个 C:\PythonXX 目录,我想确保我选择的目录被提升到前面,因此保证在我输入 python.exe 时可以访问

标签: batch-file path pipe environment-variables


【解决方案1】:

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

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

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

echo(!path! | more

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

【讨论】:

  • 谢谢,我想我可以用这个。理想情况下,我想从%PATH% 中删除我的一个或多个目标目录(如果它们已经存在)并将它们移动它们到前面,但是正如您对拆分问题的回答stackoverflow.com/a/5472168/3019689 所表明的那样,这得到在%PATH% 中有" 和/或; 的这些病理情况下真的很疯狂/无法维护。阅读了该答案后,我现在不确定问题计算机是否具有名称中带有 " 的目录,或者名称中带有 ; 的目录,然后被引用以避免解释为路径分隔符。
【解决方案2】:

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

【讨论】:

  • 另见How to search and replace a string in environment variable PATH? 它是关于如何用系统PATH中的另一个Python路径替换现有的Python路径,可以根据您的任务要求进行扩展。
  • 有时路径必须包含引号。前任。 "C:\Music ; Audio" 在目录名称中包含一个分号。所以PATH包含PATH=C:\windows\system32;"C:\Music ; Audio"
  • 是的,没错。存在这个例外。在我看来,应该根本不允许内部带有分号的目录路径,因为根本没有理由在目录名称中使用分号。但是,PATH 中的奇数个引号需要人工进行此更正,或者脚本尝试通过验证哪些目录来找出应该在 PATH 中插入缺失引号的位置在 PATH 中确实存在。删除your pretty print/split the path answervar 示例中的引号之一表明该问题。
  • 嗯,我同意它不应该在任何理智的世界中都存在,但我想处理它不幸的事实>。谁知道,如果病态命名的目录可能是一些重要的二进制文件?我曾考虑过 substring 方法——不幸的是,我提升到路径开头的目录可能并不总是正好有 11 个字符(c:\PythonXX 只是一个例子),所以硬编码的 12 是一个问题。我寻找批量查找字符串长度的方法,但它们非常糟糕——整个解决方案似乎越来越多。
  • @jez 如果需要获取变量字符串的长度,请查看批处理函数strLen
猜你喜欢
  • 2015-03-05
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多