CMD: An Pfad anhängen, ohne ihn zu duplizieren?

12

Für eine CMDSitzung kann ich leicht einen neuen Pfad festlegen:SET PATH=%PATH%;"insert custom path here"

Wenn Sie dies in einer Batchdatei tun, wird nicht berücksichtigt, ob der benutzerdefinierte Pfad bereits enthalten ist. Wie vermeide ich das Duplizieren (dh überprüfe, ob es bereits in der PATH "Zeichenfolge" enthalten ist).

Bemerkungen:

  1. Verwandte Themen: Wie füge ich benutzerdefinierte Umgebungsvariablen an die Systemvariable PATH in Windows 7 an?
  2. Verwandte Themen: Wie kann ich einen Eintrag in die PATH-Variable des Systems dauerhaft über die Befehlszeile anhängen?
  3. Gleiche Frage für UNIX: Verzeichnis zu $ ​​PATH hinzufügen, falls es noch nicht vorhanden ist
  4. Einige "CMD" -Stringoperationen wurden erklärt: http://ss64.com/nt/syntax-replace.html
Horst Walter
quelle
Es sei darauf hingewiesen, dass in diesem Zusammenhang die Vervielfältigung harmlos ist. Es wäre wahrscheinlich sinnvoller, die Duplizierung zuzulassen, als zu versuchen, sie zu vermeiden und das Risiko eines falschen Positivs einzuführen.
Harry Johnston

Antworten:

14

Ähnlich wie bei MaddHackers Antwort, nur kompakter.
echo %path%|find /i "%np%">nul || set path=%path%;%np%

%np%ist Ihr neuer Weg, natürlich können Sie stattdessen Literale verwenden. Was es macht:echo %path%|find /i "%np%">nul Durchsucht den vorhandenen Pfad nach einer Zeichenfolge und verwirft die Ausgabe. ||bedeutet Ausführung bei Fehler, also: Suchpfad für die hinzuzufügende Zeichenfolge, und falls nicht gefunden, fügen Sie sie hinzu.

Bearbeiten: Im Allgemeinen ist es nicht erforderlich, Pfade in Anführungszeichen zu setzen, auch nicht solche, die Leerzeichen enthalten Wenn Sie sie jedoch in Anführungszeichen setzen möchten, funktioniert diese Version mit Pfaden in doppelten Anführungszeichen:
echo %path%|find /i "%np:"=%">nul || set path=%path%;%np%

Bearbeiten: geändert findstr /i /c:in find /ialsfindstr können einige Sequenzen falsch interpretieren , wie durch KubaOber in den Kommentaren darauf hingewiesen ,

wmz
quelle
Schön, ich wusste, dass es einen saubereren Weg gibt, das zu tun ... ich bevorzuge immer noch Bash, aber das bin nur ich: D Danke für die Hilfe!
MaddHacker
Schön, aber funktioniert es mit Leerzeichen im Pfad? Ich habe es mit meinen speziellen Pfaden getestet, der "zitiert und mit Leerzeichen" wird erneut hinzugefügt. Man hat gerade zitiert, aber keine Leerzeichen scheinen zu funktionieren.
Horst Walter
1
@HorstWalter Ja, es sollte mit jedem Pfad funktionieren (ich habe gerade einige einschließlich Leerzeichen überprüft). Was meinst du mit "zitiert"? Sie müssen keine Anführungszeichen in Pfaden verwenden, auch nicht in solchen, die Leerzeichen enthalten. Wenn Sie %np%Anführungszeichen enthalten - ja, führt dies zu einem Fehlverhalten.
Wmz
2
@HorstWalter Siehe meine Bearbeitung. Dies ist nur dann ein Problem, wenn Sie eine Variable verwenden. Die Verwendung von Literalen (wie in echo %path%|findstr /i /c:"my path">nul || set path=%path%;"my path") sollte einwandfrei funktionieren.
Wmz
1
@wmz echo d\. | findstr /c:"d\."schlägt fehl, aber echo d\. | find "d\."erfolgreich
Reinstate Monica
4

Ich weiß, dass es schmutzig ist, aber das sollte funktionieren:

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

wo %checkstr% ist die Zeichenfolge, nach der im PATH gesucht werden soll, und wo %newpath%ist der neue PATH, der an den aktuellen PATH angehängt werden soll?

Ich hoffe, das hilft, und ich bin sicher, es gibt einen einfacheren Weg, aber das sollte den Trick für den Moment tun.

BEARBEITEN

Wenn Sie die UNIX-Tools nicht zu Windows hinzufügen möchten, können Sie diese Stapelsyntax ausprobieren:

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

Ugh, nicht hübscher, und kann als eine Zeile ausgeführt werden, wenn Sie den Befehl pipe'ed find als Unterbefehl in der if-Anweisung verwenden können ...

MaddHacker
quelle
2

Skript basierend auf der Antwort von "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
Djangofan
quelle