Wie lese ich Dateiinhalte in eine Variable in einer Batchdatei?


161

Diese Batch-Datei gibt einen Build von TEST nach LIVE frei. Ich möchte dieser Datei eine Prüfbeschränkung hinzufügen, die sicherstellt, dass sich in einem bestimmten Ordner ein zugehöriges Release-Dokument befindet.

"C:\Program Files\Windows Resource Kits\Tools\robocopy.exe" "\\testserver\testapp$"        
"\\liveserver\liveapp$" *.* /E /XA:H /PURGE /XO /XD ".svn" /NDL /NC /NS /NP
del "\\liveserver\liveapp$\web.config"
ren "\\liveserver\liveapp$\web.live.config" web.config

Ich habe also ein paar Fragen, wie ich das erreichen kann ...

  1. version.txtDer \\testserver\testapp$Ordner enthält eine Datei , und der einzige Inhalt dieser Datei ist die Build-Nummer (z. B. 45 - für Build 45). Wie lese ich den Inhalt der version.txtDatei in eine Variable in der Batch-Datei?

  2. Wie überprüfe ich, ob eine Datei vorhanden ist \\fileserver\myapp\releasedocs\ {build}.doc, indem ich die Variable aus Teil 1 anstelle von {build} verwende?

Antworten:


300

Lesen Sie den Dateiinhalt in eine Variable:

for /f "delims=" %%x in (version.txt) do set Build=%%x

oder

set /p Build=<version.txt

Beide verhalten sich mit nur einer einzigen Zeile in der Datei gleich. Bei mehr Zeilen fügt die forVariante die letzte Zeile in die Variable ein, während set /pdie erste verwendet wird.

Wenn Sie die Variable verwenden - genau wie jede andere Umgebungsvariable - ist es schließlich eine:

%Build%

Also auf Existenz prüfen:

if exist \\fileserver\myapp\releasedocs\%Build%.doc ...

Obwohl es durchaus sein kann, dass dort keine UNC-Pfade erlaubt sind. Ich kann das momentan nicht testen, aber denke daran.


4
Die setMethode liest nur ungefähr 1024 Zeichen, warum ist das so?
— Iulian Onofrei

12
Wahrscheinlich aufgrund der Grenzen eines Puffers innerhalb cmd. Es ist eine schreckliche Sprache für zuverlässige Skripte.
— Joey

Ich weiß, ich hatte stundenlang Mühe, eine Zeichenfolge in einer Datei zu ersetzen: |
— Iulian Onofrei

16
@IulianOnofrei, set /p ruft cmd!ReadBufFromInputmit einem dem Stapel zugewiesenen Puffer auf, um 1023 breite Zeichen (2046 Bytes) zu lesen. Es liest 1023 Bytes aus der Datei, wobei 1 Byte pro OEM / ANSI-Zeichen angenommen wird, dekodiert die Datei jedoch mit der aktuellen Codepage, die nicht unbedingt OEM / ANSI ist. Der schlimmste Fall ist die Codepage 65001 und eine Datei mit 4-Byte-UTF-8-Zeichen (z. B. ein altes Skript). Sie erhalten 255 Zeichen sowie ein teilweise dekodiertes Zeichen, das als Ersatzzeichen U + FFFD gespeichert ist.
— Eryk Sun

3
@ Jan : for /f "usebackq" %%x in ("path with spaces.txt") .... help forerwähnt dies übrigens.
— Joey

46

Sie können mehrere Variablen wie folgt aus einer Datei lesen:

for /f "delims== tokens=1,2" %%G in (param.txt) do set %%G=%%H

wo param.txt:

PARAM1=value1
PARAM2=value2
...

1
Das ist die perfekte Lösung. buchstäblich auf das OP zu antworten, (param.txt)sollte sein (version.txt)und es sollte enthaltenBuild=45
— robotik

Das ist die Lösung.
— Gefängnis

3
%% G war zu diesem Zeitpunkt unerwartet.
— John

4
@ John: Für die Verwendung direkt in der Kommandozeile ersetzen Sie alle %%Gdurch%G
— Stephan

32

mach einfach:

type version.txt

und es wird angezeigt, als ob Sie Folgendes eingegeben haben:

set /p Build=<version.txt
echo %Build%

4
@Jeb Ich weiß das, aber ich bin immer noch dankbar für den Typ Befehl, weil das ist, was ich brauchte
— MSM

Vielen Dank für die Bereitstellung der Typversion. Funktioniert genau für das, was ich brauche, und greift auf Dateiinhalte zu, die sich in einem freigegebenen Verzeichnis befinden.
— Tastybrownies

22

Um alle Zeilen der Datei in die Variable zu laden, ist eine verzögerte Erweiterung erforderlich. Gehen Sie wie folgt vor:

SETLOCAL EnableDelayedExpansion

for /f "Tokens=* Delims=" %%x in (version.txt) do set Build=!Build!%%x

Es gibt ein Problem mit einigen Sonderzeichen, wenn auch vor allem ;, %und!


Wenn Sie den gesamten setAusdruck in doppelte Anführungszeichen setzen, können Probleme mit mindestens einigen Sonderzeichen vermieden werden : set "Build=!Build!%%x".
— aschipfl

9
Mein Skript gibt nur "Echo ist EIN" aus. Warum ist Batch kompletter Müll?
— Trevor Hickey

Funktioniert für mich ohne verzögerte Erweiterung: set err=(nächste Zeile)for /f "delims=" %%x in (err.tmp) do set "err=%err% %%x"
— tivnet

1
Warum ist Batch kompletter Müll? ... für Konsistenz?
— Jan Nielsen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.