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

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

答え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%

編集:コメントでKubaOberが指摘したように、いくつかのシーケンスを誤解する可能性があるようfindstr /i /c:に変更しましたfind /ifindstr

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

答え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%

関連情報