CMD:添加路径而不重复吗?


12

对于一个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

应当指出,在这种情况下,重复是无害的。允许重复发生比尝试避免重复和引入假阳性风险更明智。
哈里·约翰斯顿

Answers:


14

与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 /ifindstr可能误解了一些序列由KubaOber在评论中所指出


不错,我知道有一种更清洁的方法可以...仍然喜欢使用bash,但这只是我自己:D谢谢您的帮助!
MaddHacker 2012年

很好,但是可以在路径中使用空格吗?我已经使用我的特定路径对其进行了测试,然后重新添加了“带引号和空格”。刚刚引用了一个,但似乎没有空格。
Horst Walter

1
@HorstWalter是的,它应该适用于任何路径(我刚刚检查了一些空格)。“引用”是什么意思?您无需在路径中使用引号,即使是包含空格的引号。如果您%np%包含引号-是的,它将导致其行为异常。
wmz 2012年

2
@HorstWalter看到我的编辑。如果您使用变量,这只是一个问题,使用文字(如echo %path%|findstr /i /c:"my path">nul || set path=%path%;"my path")应该可以正常工作。
wmz 2012年

1
@wmz echo d\. | findstr /c:"d\."失败,但echo d\. | find "d\."成功
恢复莫妮卡

4

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

 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

gh,没有任何漂亮之处,如果您可以在if语句中使管道的find命令作为子命令工作,则可以将它作为一行完成...


2

基于“ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.