web-dev-qa-db-ja.com

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

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
12
Horst Walter

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 as findstrは、KubaOberがコメントで指摘しているように、一部のシーケンスを誤って解釈する可能性があります

14
wmz

私はそれが汚れていることを知っていますが、これはうまくいくはずです:

 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ステートメントのサブコマンドとして機能させることができれば、1行で実行できます...

4
MaddHacker

「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
2
djangofan