Windows-Befehl FOR / F funktioniert nicht?

4868
Mark Ransom

Ich versuche, den Befehl FOR in der Befehlszeile von Windows XP zu verwenden. Ich habe eine Datei temp.txt mit 3 Zeilen:

temp1 temp2 temp3 

Und ich gebe an der Eingabeaufforderung den folgenden Befehl ein:

for /F %p in (temp.txt) do echo Testing %p 

Nichts kommt zurück. Wenn ich den Parameter / F entferne, wird der Ausgang ausgegeben Testing temp.txt.

Soweit ich das feststellen kann, verwende ich den Befehl genau so, wie er von Microsoft dokumentiert ist . Ich habe meine Registry überprüft, um sicherzustellen, dass die Befehlserweiterungen aktiviert sind, und sogar eine neue Shell gestartet cmd /e:on, um sicher zu gehen.

Was mache ich falsch?

Ja, ich habe etwas falsch gemacht.

Die Datei temp.txt wurde nicht von Grund auf erstellt. Ich habe sie gerade bearbeitet, um sie in den Testinhalt zu packen. Als ich die Datei das erste Mal erstellt habe, habe ich sie leider mit einem UTF-8-Marker an der Vorderseite gespeichert. Das Wiederherstellen der Datei als Nur-Text löste das Problem.

0
Ich hasse es, die blöde Frage zu stellen, aber sind Sie sicher, dass Sie sich im selben Verzeichnis wie `temp.txt` in der Befehlszeile befinden? Ich kann mir keinen Grund vorstellen, warum es nicht funktionieren würde. Agent_9191 vor 14 Jahren 0
Ja, ich bin im Verzeichnis. Ich habe auch einen vollständigen Pfad zur Datei getestet, aber ich versuche, so viele irrelevante Details wie möglich zu beseitigen. Mark Ransom vor 14 Jahren 0
Verwenden Sie echo ...> oder kopieren Sie con, um schnell eine Datei zum Testen zu erstellen. Dann haben Sie gesehen, dass sie funktioniert. Dann könnten Sie xxd oder od verwenden und die Unterschiede untersuchen. barlop vor 13 Jahren 0

4 Antworten auf die Frage

4
atroon

Ich vermute, dass dies das gewünschte Ergebnis ist:

H:\>for /F %p in (temp.txt) do echo Testing %p  H:\>echo Testing temp1 Testing temp1  H:\>echo Testing temp2 Testing temp2  H:\>echo Testing temp3 Testing temp3 

Wenn ja, haben Sie andere Batch-Dateien getestet oder die Eingabe / Ausgabe umgeleitet? Wenn Sie dies als Teil eines größeren Projekts durchführen, haben Sie möglicherweise Trennzeichen oder den Parameter Skip in den Befehl FOR geändert? Ist es möglich, dass sich vor Ihrer temp.txt-Datei nicht druckbare Zeichen befinden? Ich habe das für ein paar verschiedene Computer, darunter einen 2k3 Server Std. box ... Ich kann nicht anders, ich denke es gibt entweder Probleme mit Ihrer Eingabedatei oder Standardeinstellungen werden ohne Ihr Wissen festgelegt.

Ich habe das Problem herausgefunden, bevor ich diese Antwort sah, aber da es die tatsächliche Lösung enthält (nicht druckbare Zeichen vorne), wähle ich diese als akzeptierte Antwort. Mark Ransom vor 14 Jahren 0
2
Ken

Statt zu testen mit echo, was einfach die Namen in der Gruppe übernimmt (selbst wenn die Datei nicht existiert), versuchen Sie etwas wie type:

for %p in (temp.txt) do type %p 

Das zeigt Ihnen, was die Shell "sieht". (Beachten Sie, dass / F mit einer nicht vorhandenen Datei sich darüber beschwert, dass die Datei nicht gefunden wurde. Möglicherweise haben Sie jedoch mehr als eine Temp.txt-Datei?)

Ja, dieser Befehl zeigt mir den Inhalt von temp.txt. Danke für den Vorschlag, aber mir ist unklar, was ich durch den Versuch lernen sollte. Mark Ransom vor 14 Jahren 1
Festlegen einer Baseline, dass die Datei vorhanden, lesbar und die richtige ist. Als Nächstes wollte ich Sie fragen, wie Sie die Datei erstellt haben - ich habe gute alte "copy con" verwendet -, aber ich sehe, Sie haben es herausgefunden. Die BOM schlägt wieder zu! Ich werde es in der psychischen Debugging-Liste um eine Stufe höher schlagen müssen. Ken vor 14 Jahren 0
2
Paul Tomasi

Der richtige Ansatz ist folgender:

for %%a in (temp1 temp2 temp3) do ( echo Testing %%a for /f %%b in (%%a) do echo %%b ) 

Oder Sie könnten das tun:

for /l %%n in (1,1,3) do ( for %%a in (temp%%n) do ( echo Testing %%a for /f %%b in (%%a) do echo %%b ) ) 

Eine andere Variante ist:

for %%a in (*.txt) do ( echo Testing %%a for /f %%b in (%%a) do echo %%b ) 

Usw...

Wenn die Dateinamen Leerzeichen enthalten, müssen Sie 'usebackq' mit 'FOR / F' verwenden und die Dateinamen in Anführungszeichen wie folgt einschließen:

... for /f "usebackq" %%b in ("%%a") do echo %%b ... 
0
Pablo

Ich habe Stunden damit verbracht. Sie müssen temp.txt durch 'type temp.txt' ersetzen:

for /F %p in ('type temp.txt') do echo Testing %p