Verwenden von Prozentzeichen (%) in der Echo-Anweisung in derselben Zeile wie die IF-bedingte Überprüfung der Variablen

Verwenden von Prozentzeichen (%) in der Echo-Anweisung in derselben Zeile wie die IF-bedingte Überprüfung der Variablen

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. endlocalin der nächsten Zeile oder sogar einer leeren nächsten Zeile).Jedoch, die Verwendung %1von 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 barund USERPROFILEwö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")

verwandte Informationen