Ich versuche, diese Zeile in einer Batchdatei zu verwenden
If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
und wenn ich es ausführe, bekomme ich dies
) was unexpected at this time.
C:\> If NOT "ARGUMENTBARUSERPROFILE\Desktop\Log File.txt")
(ARGUMENT = welches Argument/welcher Parameter auch immer ich beim Ausführen der Batchdatei verwendet habe)
Ich habe alle möglichen Variationen ausprobiert, einschließlich der Änderung von „Log File.txt“ in „LogFile.txt“ und der Entfernung der Anführungszeichen um den Pfad, und habe es auf die Tatsache eingegrenzt, dass es immer dann abbricht, wenn ein %
Zeichen (vom Versuch, eine Variable wiederzugeben) oder ein Doppelpunkt (vom Pfad rechts neben >>
) vorhanden ist. Ich habe keine Ahnung, was das Problem mit dem Doppelpunkt ist, aber bei %
einem scheint es so, als sei er gierig und liest die Zeile so, dass die getestete Variable die gesamte zusammengesetzte Zeichenfolge aller von einem %
Paar umschlossenen Inhalte plus dem Rest der Zeile ist (vermutlich, weil danach kein Operator folgt und es einfach weitergeht, bis es am Ende auf die Klammer trifft). Es scheint also, dass entweder etwas maskiert werden muss, dass ich etwas anderes ändern muss oder dass es einfach nicht möglich ist.
Mir ist klar, dass ich die Echo-Anweisung einfach in eine andere Zeile setzen könnte, so wie hier
If NOT... (
echo...
)
aber ich mache es lieber in einer Zeile, teilweise weil es übersichtlicher ist, aber hauptsächlich, weil ich neugierig bin und solche Sachen gerne herausfinde, und ich hasse es, wenn ich es nicht kann.
Übrigens ist der verzögerte Ausdruck aktiviert.
EDIT: Basierend auf @AFHs Kommentar habe ich es in einer Batch-Datei selbst getestet und festgestellt, dass dies
@echo on
setlocal enableDelayedExpansion
SET bar=test
If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
gibt den Fehler nicht, aber setzenirgendetwasdanach (z. B. endlocal
in der nächsten Zeile oder sogar einer leeren nächsten Zeile).Jedoch, die Verwendung %1
von anstelle von %1%
, wie von ADH erwähnt, hat das Problem behoben, also war das das Problem. Daher ist dies gelöst.
Antwort1
Ich konnte Ihren Fehler nicht genau reproduzieren, aber ich kann bestätigenAFHs Beobachtungdass Befehlszeilenparameter (z. B. , , usw.) und nicht sind , also sollte Ihr Befehl sein%n
%1
%2
%n%
If NOT "%1"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
Ich glaube, ich kann etwas Licht ins Dunkel bringen, was passiert, wenn Sie das zusätzliche einfügen %
. CMD scheint Befehlszeilen nach Parametern und Variablen zu analysieren, bevor es irgendetwas anderes tut, und es verwendet einen sehr einfachen Parser. Wenn es auf ein stößt %
,
- Wenn das nächste Zeichen eine Ziffer ist, handelt es sich um einen Positionsparameter.
%n
- wenn es etwas anderes ist, ist es eine Variable ( ), und
%name%
allesbis zum nächsten%
ist diename
. Ich schätze, es wird wirklich verwirrend, wenn es keine passende gibt%
.
So wird Ihr Befehl analysiert:
If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
\/\---------------/ \-----------/ \---------------------- ...?
Es denkt, dass "=="foo" (echo
und Text. >> "
Variablennamen sind, während bar
und USERPROFILE
wörtlicher Text ist. Wenn Sie beispielsweise Ihren Befehl mit dem Argument „hello“ ausführen, wird diese Fehlermeldung angezeigt, die Ihrer ähnelt:
Die Syntax des Befehls ist falsch. C:(Aktuelles Verzeichnis)> Wenn NICHT "hellobarUSERPROFILE\Desktop\Log File.txt")