2016-08-01 5 views
1

ich diese Batchdatei haben eine Umgebungsvariable anhängen, wenn nicht vorhandenWindows-Check-String enthält nicht eine andere Arbeits

setLocal EnableDelayedExpansion 
set echo off       

set envPath=%PATH% 
set comPath=";D:\Package\Libraries\Lib" 

if x%envPath:comPath=%==x%envPath% (
    setx PATH "%PATH%;D:\Package\Libraries\Lib" /M 
) 
pause 

Aber es funktioniert nicht und sagt Datei diesmal unerwartet war

ich auf Batch file: Find if substring is in string (not in a file) basierend schrieb

+0

Sie benötigen 'if '! EnvPath:% comPath% =!" == "! EnvPath!" '... Ihr Formular testet, ob die literale Zeichenfolge' comPath' vorhanden ist; Sie möchten sehen, ob der _contents_ von 'comPath' vorhanden ist. Dazu müssen Sie sowohl '%' als auch '!' Referenzen verwenden. – TripeHound

+0

@Billa, Sie haben einen Beispielcode genommen, der nicht verwendet werden sollte. Siehe auch answers unter [Warum werden auch andere Ordnerpfade zum System PATH mit SetX hinzugefügt und nicht nur der angegebene Ordnerpfad?] (Http://stackoverflow.com/questions/25915767) und [Einstellung der Pfadumgebungsvariablen in der Batch-Datei nur einmal aktiviert Win7] (http://stackoverflow.com/questions/31885906) und [Wie kann ich eine .bat-Datei verwenden, um bestimmte Token aus der PATH-Umgebungsvariablen zu entfernen?] (Http://stackoverflow.com/a/38664286/3074564) für bessere Lösungen und eine Erklärung, warum nicht lokale __PATH__ auf dem Update-System __PATH__ verwenden. – Mofi

+1

Das Erkennen, ob ein Wert in PATH vorhanden ist, ist viel komplizierter als Sie feststellen. Werfen Sie einen Blick auf [Wie kann ich überprüfen, ob das Verzeichnis in% PATH% existiert?] (Http://Stackoverflow.com/a/8046515/1012053) – dbenham

Antwort

2

Wie in dem obigen Kommentar erwähnt, verzögerte Einsatz Expansion im Saitenset und regelmäßigen Expansion in den String ersetzen. Führen Sie diese Partie als Admin von Verknüpfung oder von Admin Cmd Prompt:

@echo off 
setLocal EnableDelayedExpansion 
set "comPath=D:\Package\Libraries\Lib"      
set "envPath=%PATH%" & set "Separator=" 
if not "%envPath:~-1%" == ";" set "Separator=;" 

if "!envPath:%comPath%=!"=="%envPath%" (
    setx PATH "%PATH%%Separator%%comPath%" /M) 
timeout 5 
exit /b 

Beachten Sie, dass aktualisiert PATH wird nur auf Cmd Neustart von Registry erneut gelesen werden. Wenn Sie den geänderten PATH im selben Batch verwenden müssen, verwenden Sie SET anstelle von SETX, um den PATH für diese Cmd-Sitzung vorübergehend festzulegen.

In einem ähnlichen Konstrukt, wenn Ihr persönlicher Pfad comPathinnerhalb gesetzt IF oder FOR-Schleife statt call set "PATH=%%envPath:!comPath!=%%" verwenden.

+0

warum 'timeout 5' und' exit' benötigt? – Billa

+0

Wenn dies Ihr gesamtes Skript ist, wird _exit/b_ den Cmd-Speicher bereinigen, sodass Sie einen neuen Stapel aus demselben geöffneten Cmd-Fenster starten können. Und _timeout_ wird normalerweise zum Debuggen hinzugefügt, wenn Sie einen Stapel mit einem Doppelklick starten und etwas Zeit benötigen, um seine Echo oder Fehlerausgabe zu lesen, bevor das Fenster geschlossen wird. Es gibt Ihnen nur das Konstrukt, um Code-Variationen zu testen. :) – sambul35

+0

Versuchte dies, bekam aber erneut einen Fehler. Außerdem habe ich 'set' geändert comPath =; D: \ Package \ Libraries \ Lib "' zu 'setzen comPath ="; D: \ Package \ Libraries \ Lib "' – Billa

Verwandte Themen