CMD:複製せずにパスに追加しますか?


12

1つの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

この文脈では、複製は無害であることを指摘しておく必要があります。重複を回避して、誤検知のリスクを導入するよりも、重複を許可する方が賢明でしょう。
ハリージョンストン

回答:


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 /iようにfindstrコメントでKubaOberで述べたように、いくつかのシーケンスを誤って解釈すること


いいですね、それを行うためのよりクリーンな方法があることを知っていました...それでもbashを好むのですが、それは私だけです:D助けてくれてありがとう!
MaddHacker

いいですが、パス内のスペースで機能しますか?私はそれを自分の特定のパスでテストしましたが、「引用符付きでスペース付き」のパスが再度追加されます。引用しただけですが、スペースが機能しないようです。
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

ええと、きれいではなく、ifステートメントでサブコマンドとして機能するパイプ付きのfindコマンドを取得できる場合は、1行として実行できます...


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.