CMD:附加到路径而不复制它?

CMD:附加到路径而不复制它?

对于一个CMD会话,我可以轻松设置一条新路径:SET PATH=%PATH%;"insert custom path here"

在批处理文件中执行此操作不会考虑自定义路径是否已包含。如何避免重复(即检查它是否已包含在 PATH“字符串”中)。

评论:

  1. 有关的:如何将用户定义的环境变量附加到 Windows 7 中的系统变量 PATH?
  2. 有关的:如何通过命令行将条目永久地附加到系统的 PATH 变量中?
  3. 对于 UNIX 也有同样的问题:如果目录尚不存在,则将其添加到 $PATH
  4. 一些“CMD”字符串操作解释:http://ss64.com/nt/syntax-replace.html

答案1

与MaddHackers的答案类似,但更紧凑。
echo %path%|find /i "%np%">nul || set path=%path%;%np%

%np%是您的新路径,当然您也可以使用文字代替。它的作用是:echo %path%|find /i "%np%">nul搜索现有路径中的字符串,丢弃输出。||表示失败时执行,因此它意味着: 搜索要添加的字符串的路径,如果未找到,则添加它。

编辑:一般来说,不需要引用路径,即使是包含空格的路径,但是如果你想引用他们,此版本将适用于双引号路径:
echo %path%|find /i "%np:"=%">nul || set path=%path%;%np%

编辑:更改findstr /i /c:find /i可能findstr会误解一些序列,正如 KubaOber 在评论中指出的那样

答案2

我知道这很脏,但这应该可行:

 SET PATH=$(echo $PATH | awk -F"%checkstr%" '{ print ($(NF-1) ~ 0) ? $PATH:%newpath% : $PATH; }')

其中%checkstr%是在 PATH 中检查的字符串,%newpath%是附加到当前 PATH 的新 PATH

希望这会有所帮助,我相信还有更简单的方法,但现在这应该可以解决问题。

编辑

因此,如果您不想将 UNIX 工具添加到 Windows,您可以尝试以下批处理语法:

echo %PATH% | find /C /I "<string to find>" > out.txt 
set /p dne= < out.txt
if 0 EQU %dne% (set PATH=%PATH%;"<custom path>")
del out.txt

呃,没有任何漂亮之处,如果您可以让管道 find 命令作为 if 语句中的子命令工作,那么可以将其作为一行完成......

答案3

基于“wmz”的答案的脚本:

@ECHO off
ECHO java_home=%JAVA_HOME%
SET javapath=%JAVA_HOME%\bin
ECHO %path%|findstr /i /c:"%javapath:"=%">nul || set path=%path%;%javapath%
ECHO Path=%path%
PAUSE

答案4

2021 年更新答案:

set不再起作用,我们需要使用setx(略有不同的语法):

SET mypath=C:\dev\vendor\sass\1.32.4
ECHO %Path%|findstr /i /c:"%mypath:"=%">nul || setx Path "%Path%";%mypath%

相关内容