Warum wandelt Windows den Operator "=

Warum wandelt Windows den Operator "=

Ich habe folgende Batchdatei:

SET /P FOO=<"foo.txt"

foo.txtDies ist ein Versuch, den Inhalt von in die Variable einzulesen FOO, wie in vorgeschlagen.Wie lese ich Dateiinhalte in eine Variable in einer Batchdatei? . Diese Methode hat bei mir bisher gut funktioniert.

Wenn ich das Skript ausführe, erhalte ich die folgende Ausgabe:

SET /P FOO= 0<"foo.txt"

Dies ist nicht nur ein Anzeigefehler, der Wert wird nicht in die Variable eingelesen. Warum passiert das? Wie behebe ich das?

Ich sehe dies auf mehreren Maschinen, EOL- oder Kodierungsprobleme scheinen nicht die Ursache zu sein.

Antwort1

Sind Sie sicher, dass es nicht funktioniert? Ich habe versucht, das Problem zu reproduzieren, und das hier ist das Ergebnis:

D:\>notepad test.bat //i've put SET /P FOO=<"foo.txt" inside it
D:\>echo asdf > foo.txt
D:\>test.bat
D:\>SET /P FOO= 0<"foo.txt"
D:\>echo %FOO%
asdf
D:\>

Es werden also Daten hinzugefügt 0<, aber dennoch die Daten aus der Datei werden auf die Variable angewendet.

Antwort2

Um die ursprüngliche Frage zu beantworten, wie @grawitywies darauf hin=<ist nur eine Kurzform für , = <0die eine völlig in Ordnung befindliche Syntax hat und tatsächlich wie erwartet funktioniert (wenn man es einmal getestet hatkorrekt).

An der Ausgabe ist also alles in Ordnung, es handelte sich lediglich um eine Ablenkung, als ich ein anderes Problem untersuchte.

Das Problem bezog sich auf einen Codeabschnitt, der diesem ähnelte:

@ECHO OFF
SETLOCAL
SET TEST=Fail
ECHO Pass>foo.txt

IF ERRORLEVEL 0 (
SET /P TEST=<foo.txt
ECHO %TEST%
)

Beim Ausführen erwartete ich eine Ausgabe von Pass, da dies aus gelesen werden sollte foo.txt, aber die Ausgabe lautet Fail. Ich vermutete, dass dies an der „verstümmelten“ Syntax liegt.

Wie @Joey jedochwies darauf hinDieses Verhalten hängt zusammen mitverzögerte Expansion.

Damit der obige Code funktioniert, muss er wie folgt umgeschrieben werden:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET TEST=Fail
ECHO Pass>foo.txt

IF ERRORLEVEL 0 (
SET /P TEST=<foo.txt
ECHO !TEST!
)

verwandte Informationen