Windows-Befehl FOR / F funktioniert nicht?

0

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

temp1
temp2
temp3

Und ich gebe den folgenden Befehl an der Eingabeaufforderung ein:

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

Nichts kommt zurück. Wenn ich den / F-Parameter entferne, ist die Ausgabe Testing temp.txt.

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

Was mache ich falsch?

Ja, ich habe etwas falsch gemacht.

Die Datei temp.txt wurde nicht von Grund auf neu erstellt. Ich habe sie nur bearbeitet, um sie in meinen Testinhalt aufzunehmen. Leider habe ich die Datei beim ersten Erstellen mit einem UTF-8-Marker auf der Vorderseite gespeichert. Das Wiederherstellen der Datei als Klartext behebt das Problem.

Mark Ransom
quelle
hasse es, die blöde Frage zu stellen, aber sind Sie sicher, dass Sie sich in demselben Verzeichnis wie temp.txtin der Befehlszeile befinden? Ich kann mir keinen Grund vorstellen, warum es außerhalb davon nicht funktionieren würde.
Agent_9191
Ja, ich bin im Verzeichnis. Ich habe auch mit einem vollständigen Pfad zur Datei getestet, aber ich versuche, so viele irrelevante Details wie möglich zu beseitigen.
Mark Ransom
Verwenden Sie echo ...> oder copy con, um schnell eine Datei zum Testen zu erstellen. Dann hätten Sie gesehen, wie sie funktioniert. Dann könnten Sie xxd oder od verwenden und die Unterschiede untersuchen.
Barlop

Antworten:

4

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 tun, haben Sie möglicherweise Trennzeichen oder den Skip-Parameter in den FOR-Befehl geändert? Ist es möglich, dass die Datei temp.txt nicht druckbare Zeichen enthält? Ich habe dies auf ein paar verschiedenen Computern zum Laufen gebracht, darunter ein 2k3 Server Std. box ... Ich kann nicht anders, als zu glauben, dass es Probleme mit Ihrer Eingabedatei gibt oder dass die Standardeinstellungen ohne Ihr Wissen festgelegt werden.

atroon
quelle
Ich habe das Problem herausgefunden, bevor ich diese Antwort gesehen habe, aber da sie die eigentliche Lösung enthält (nicht druckbare Zeichen vorne), wähle ich diese als akzeptierte Antwort.
Mark Ransom
2

Anstatt mit zu testen echo, bei dem die Namen im Set unverändert bleiben (auch wenn die Datei nicht vorhanden ist), versuchen Sie Folgendes type:

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

Das wird dir zeigen, was die Shell "sieht". (Beachten Sie, dass sich / F mit einer nicht vorhandenen Datei darüber beschwert, dass die Datei nicht gefunden wurde, aber Sie haben möglicherweise mehr als eine temp.txt in der Nähe?)

Ken
quelle
1
Ja, dieser Befehl zeigt mir den Inhalt von temp.txt. Vielen Dank für den Vorschlag, aber mir ist nicht klar, was ich lernen sollte, indem ich es ausprobiere.
Mark Ransom
Nur eine Grundlinie erstellen, dass die Datei vorhanden, lesbar und die richtige ist. Als nächstes wollte ich fragen, wie Sie die Datei erstellt haben - ich habe gute alte verwendet copy con-, aber ich sehe, Sie haben es herausgefunden. Die Stückliste schlägt wieder zu! Ich werde es in der psychischen Debugging-Liste noch ein wenig krachen lassen müssen.
Ken
2

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 dies 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 weitere 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 doppelte Anführungszeichen setzen:

...
for /f "usebackq" %%b in ("%%a") do echo %%b
...
Paul Tomasi
quelle
0

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

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