Frage

Ich versuche, die folgende lächerliche Aufgabe zu erfüllen:

Ich habe eine Textdatei mit einer Reihe von vollständig qualifizierten filesnames enthält. Ich möchte durch die Datei zu durchlaufen und jede Zeile mit einer gemeinsamen Variable anzuhängen, die zu einem Kommandozeilen-Tool übergeben werden kann. Zum Beispiel könnte die Datei sein:

  

C: \ dir \ test.txt

     

C: \ WINDOWS \ test2.txt

     

C: \ text3.txt

und ich möchte sie zu einem gewissen Variablen zugewiesen werden ‚a‘, so dass:

a = "C:\dir\test.txt C:\WINDOWS\test2.txt C:\text2.txt"

Eine zweite Frage ist - was ist eine gute Batch-Datei Referenz? Ich bin ein paar Sachen in dem Windows-Material zu finden, und eine Menge von home-grown-Websites, aber nichts besonders abgeschlossen.

War es hilfreich?

Lösung

Wie für Referenzen, SS64.com ist nicht schlecht. Rob van der Woude ziemlich oft verknüpft wird, auch.


Wie für Ihr Problem, das ist einfach:

@echo off
setlocal enableextensions enabledelayedexpansion

set LIST=
for /f %%x in (yourfile.txt) do (
    set LIST=!LIST! "%%x"
)

echo %LIST%

endlocal

Weitere in ausführliche Erläuterung:

setlocal enableextensions enabledelayedexpansion

Wir ermöglichen verzögerte Erweiterung hier. Dies ist entscheidend, da sonst wären wir nicht in der Lage sein, die Liste der Dateien im for Schleife zu manipulieren, die folgen.

for /f %%x in (yourfile.txt) do (
    set LIST=!LIST! "%%x"
)

for /f iteriert über Zeilen in einer Datei, so genau das, was wir brauchen hier. In jeder Schleife Iteration anhängen wir die nächste Zeile zu der LIST Variable. Beachten Sie die Verwendung von !LIST! statt der üblichen %LIST%. Dies signalisiert verzögerte Expansion und stellt sicher, dass die Variable wird jedes Mal dieser Befehl ausgeführt wird, neu bewertet.

In der Regel cmd erweitert Variablen auf ihre Werte, sobald eine Zeile gelesen wird und analysiert wird. Für cmd eine einzelne Zeile ist entweder eine Linie oder alles, was zählt als eine Linie, die für die Blöcke begrenzt durch Klammern, wie wir sie hier verwendet, um wahr zu halten geschieht. Also für cmd der gesamte Block ist eine einzige Aussage, die gelesen wird und einmal analysiert, und zwar unabhängig davon, wie oft das Innere der Schleife ausgeführt wird.

Wenn wir %LIST% hier statt !LIST! verwendet hätten, dann würde die Variable sofort durch seinen Wert (leer an diesem Punkt) ersetzt worden ist, und die Schleife würde so ausgesehen hat:

for /f %%x in (yourfile.txt) do (
    set LIST= "%%x"
)

Dies ist eindeutig nicht das, was wir wollten. Verzögerte Erweiterung sorgt dafür, dass eine Variable nur erweitert wird, wenn sein Wert wird wirklich benötigt wird. In diesem Fall, wenn das Innere der Schleife läuft und eine Liste von Dateinamen konstruiert.

Danach wird die Variable %LIST% oder !LIST! (jetzt ist es nicht wirklich wichtig, mehr, welche zu verwenden) die Liste der Zeilen aus der Datei enthält.

Komischerweise enthält die Hilfe für den Befehl set genau dieses Beispiel für die verzögerte Expansion:

  

Schließlich Unterstützung für verzögert   Erweiterung von Umgebungsvariablen hat   hinzugefügt. Diese Unterstützung ist immer   standardmäßig deaktiviert, kann aber sein,   aktiviert / über den / V-Befehl Behinderte   Leitungsschalter nach CMD.EXE. Siehe CMD /?

     

Verzögerte Erweiterung von Umgebungsvariablen   ist nützlich, um rund um die   Einschränkungen der aktuellen Expansion   die geschieht, wenn eine Textzeile ist,   lesen, nicht, wenn sie ausgeführt wird. Das   folgende Beispiel zeigt die   Problem mit sofortigem Variable   Expansion:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)
     

würde nie die Nachricht anzuzeigen, da   das% VAR% in IF-Anweisungen BEIDE ist   wenn der erste substituierte IF   Anweisung gelesen wird, da es logisch   weist der Körper des IF, das ist   eine zusammengesetzte Anweisung. So ist die IF   innerhalb der zusammengesetzten Anweisung ist   wirklich zu vergleichen „vor“ mit „nach“   die nie gleich sein. Ähnlich,   Im folgenden Beispiel wird nicht funktionieren wie   erwartet:

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
     

, dass es baut keine Liste   Dateien im aktuellen Verzeichnis, aber   stattdessen setzen nur die LIST   Variable in die letzte Datei gefunden.   Auch dies ist, weil die% LIST% ist   erweitert nur einmal, wenn die FOR   Anweisung gelesen wird, und zu diesem Zeitpunkt   die LIST Variable ist leer. so ist die   Ist FOR-Schleife ist, die wir ausführen:

for %i in (*) do set LIST= %i
     

, die nur Liste Einstellung auf das hält   letzte Datei gefunden.

     

Verzögerte Erweiterung von Umgebungsvariablen   Damit können Sie ein anderes verwenden,   Zeichen (das Ausrufezeichen) an   erweitern Umgebungsvariablen an   Ausführungszeit. Wenn verzögerte Variable   Expansion ermöglicht wird, die oberhalb   Beispiele geschrieben werden könnte wie folgt   zu arbeiten, wie beabsichtigt:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%

Andere Tipps

Was Sie nach mit einem FÜR / F-Befehl durchgeführt werden.

Hier ist eine gute Ressource, die ich viele Male verwendet haben:

http://www.robvanderwoude.com/batchfiles.php

Ein gutes Buch: Windows NT Shell Scripting von Tim Hill. Die Ausgabe I wurde 1998 veröffentlicht, aber es ist für Windows-Befehl Programme in Windows 2008 noch gültig ist.

type *commonfilepart* >> concat_result_file

OS: Windows Server 2003

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top