Array in DOS-Batch-Skript auffüllen

124004
Jim Fell

Wie kann ich eine Array-Variable in einem DOS-Batch-Skript einrichten? Ich möchte es mit einer Liste von Dateinamen laden, die verarbeitet werden sollen. Ich möchte das wirklich so einfach wie möglich halten. Vielen Dank.

33
Müssen Sie * wirklich * DOS-kompatibel sein, oder können Sie PowerShell verwenden? Brian Knoblauch vor 13 Jahren 1
Sie können vbscript auch ganz einfach dafür verwenden ... JNK vor 13 Jahren 1
@ Brian: DOS ist erforderlich. Sehen Sie sich die Lösung an, die ich gepostet habe. Jim Fell vor 13 Jahren 0
Wenn Sie keine Haare haben, sollten Sie den Unterschied zwischen der Eingabeaufforderung und DOS kennen barlop vor 9 Jahren 0

12 Antworten auf die Frage

48
Jim Fell

Ich habe es herausgefunden:

set FILE_LIST=(file1.dll file2.exe file3.dll file4.dll file5.dll)  set BIN_PATH="C:\Program Files\My App Folder\bin" set BAK_PATH="C:\Program Files\My App Folder\bin\Backups" set DEV_PATH="C:\My Dev Path\bin\Debug"  for %%i in %FILE_LIST% do copy %BIN_PATH%\%%i %BAK_PATH% for %%i in %FILE_LIST% do copy %DEV_PATH%\%%i %BIN_PATH% 

Ich habe vor einigen Jahren so etwas gemacht, also musste ich einfach etwas herausfinden. (übrigens, ich hasse es, das Rad neu zu erfinden.) Nun, da es hier veröffentlicht ist, wird es hoffentlich auch für andere nützlich sein.

Nun, ich wusste nie, dass du das tun könntest! Ich habe es ausprobiert und es funktioniert! Linker3000 vor 13 Jahren 1
Dies kann möglicherweise nicht in DOS funktionieren. DOS verwendet keine langen Dateinamen (nur 8.3), und ich erinnere mich daran, dass DOS auch keine Anführungszeichen in Dateipfaden enthält. Ich habe keine MS-DOS-Installation zur Hand, um zu sehen, ob sie Arrays unterstützt, die eine `()` - Syntax verwenden. a CVn vor 10 Jahren 0
Dies funktioniert zwar zu Ihrem Zweck, es sollte jedoch beachtet werden, dass es sich nicht wirklich um ein Array handelt. Es ist nur eine Zeichenfolge, die in einzelne Elemente aufgeteilt wird. Sie können die Elemente nicht direkt referenzieren, indem Sie zum Beispiel `FILE_LIST [0]` verwenden. aphoria vor 9 Jahren 3
@ MichaelKjörling: FreeDOS [kann LFNs unterstützen] (http://www.freedos.org/software/?prog=lfndos) und vermutlich Zitate, vielleicht verwendet er das? Nathan Tuggy vor 8 Jahren 0
@ NathanTuggy Guter Punkt. Dennoch wäre es in diesem Fall besser, wenn es explizit gemacht würde. a CVn vor 8 Jahren 0
@ MichaelKjörling: Auf jeden Fall. (Und realistischerweise scheint es wahrscheinlicher, dass es sich um cmd.exe handelt, aber man weiß es nie.) Nathan Tuggy vor 8 Jahren 0
@NathanTuggy Nun, OP * hat * in den Kommentaren explizit angegeben, dass "DOS erforderlich" ist. DOS! = Windows-Eingabeaufforderung (und * insbesondere * sollte ein Programmierer das wissen ...). Sie waren an einem Punkt ein und dasselbe, aber das war jetzt vor zwei Jahrzehnten ... a CVn vor 8 Jahren 0
12
Patrick Jackson

Ja, Sie können Arrays im Stapel ausführen. Während sie nicht genau wie Arrays in C oder VB sind, können Sie es tun:

@echo off setlocal enabledelayedexpansion  set arrayline[0]=############ set arrayline[1]=#..........# set arrayline[2]=#..........# set arrayline[3]=#..........# set arrayline[4]=#..........# set arrayline[5]=#..........# set arrayline[6]=#..........# set arrayline[7]=#..........# set arrayline[8]=#..........# set arrayline[9]=#..........# set arrayline[10]=#..........# set arrayline[11]=#..........# set arrayline[12]=############  ::read it using a FOR /L statement for /l %%n in (0,1,12) do ( echo !arrayline[%%n]! ) pause 
das ist großartig und inspring .. Ich habe gerade eine Antwort darauf gemacht, die darauf aufbaut und auch das Array auffüllt barlop vor 9 Jahren 1
7
harrymc

Arrays in Batch beschreibt in Jakash3s Blog, wie Arrays in der Eingabeaufforderung emuliert werden.

Der Artikel enthält eine Batchdatei mit dem Namen array.bat, die eine Funktionsbibliothek enthält, die zur Behandlung von Arrays verwendet wird. Sie müssen den Text im Artikel auswählen und in die bat-Datei einfügen.

Zum Beispiel das folgende Testskript:

@echo off set book[0]=Avatar set book[1]=The Green Mile set book[2]=The Count of Monte Cristo call array.bat add book Babo call array.bat len book length echo I have %length% books you can borrow. echo Pick one: echo. echo 0) Avatar echo 1) The Green Mile echo 2) The Count of Monte Cristo echo 3) Babo echo. set /p pick= call array.bat getitem book %pick% title echo. echo You picked %title%. 

erzeugt die folgende Ausgabe:

Bild

ok, obwohl Sie den Inhalt von array.bat nicht aufgelistet haben, obwohl ich sehe, dass er etwas lang ist barlop vor 10 Jahren 1
3
barlop

Dadurch wird ein Array aufgefüllt und gedruckt

Sie können Namen1 Namen2 Namen3 anstelle von Namen [1] Namen [2] Namen [3] verwenden, indem Sie Namen schreiben! I! anstelle von Namen [! i!]. Es erzeugt das Array durch Generieren von Variablennamen. Es gibt keine Array-Struktur im Stapel. Aber es ist so ordentlich wie jede Array-Struktur, und das Ausfüllen oder Drucken sieht genauso aus, wie man ein Array in einer richtigen Sprache ausfüllen oder drucken würde (die tatsächlich die Array-Struktur hat!)

@echo off setlocal enabledelayedexpansion enableextensions  set i=-1  for %%f in (bob, tom, joseph) do ( set /a i=!i!+1 set names[!i!]=%%f ) set lastindex=!i!  for /L %%f in (0,1,!lastindex!) do (  echo !names[%%f]! ) 

die Ausgabe-

c:\blah>a bob tom joseph  c:\blah> 

Einige erklärung-

Das setlocal enabledelayedexpansion enableextensionsmit der! Var! Statt% var% ist erforderlich, um ein ungerades Verhalten zu verhindern, sodass sich Variablen innerhalb eines FOR oder eines IF richtig verhalten. Bei Batch-Dateien ist das eine Kuriosität. Sehen Sie, set /?wo das weiter erwähnt wird.

Dies ist, was das Array ausfüllt, und es ist für jeden, der sich mit Arrays auskennt, ziemlich direkt. Sie könnten auch tun, names[0]=bob names[1]=tom names[2]=josephobwohl eine der Schönheiten eines Arrays die Fähigkeit ist, ein Array mit einer Schleife zu füllen, was ich hier getan habe.

for %%f in (bob, tom, joseph) do ( set /a i=!i!+1 set names[!i!]=%%f ) set lastindex=!i! 

Dies zeigt das Array an. %% f Wenn Sie das Echo anzeigen, wird der Wert von 0 bis zum letzten Index des Arrays in Schritten von 1 verschoben. Dadurch werden Namen [0] Namen [1] Namen [2] gedruckt.

for /L %%f in (0,1,!lastindex!) do (  echo !names[%%f]! ) 
1
JNK

Sie können nicht wirklich ein Array in der Eingabeaufforderung tun (und es ist auch nicht wirklich DOS, wenn Sie mit Windows 3.1). Sie können jedoch mit dem Befehl FOR eine satzbasierte Verarbeitung durchführen .

Um die Liste der zu verarbeitenden Dateien zu erstellen, können Sie manuell eine zu verarbeitende Textdatei erstellen oder den dir /b <mask>Befehl in der FOR-Schleife verwenden.

Etwas, das ich mit FOR auf die harte Tour gelernt habe - Sie müssen eine SINGLE CHARACTER- Variable als Cursor verwenden!

+1 Sie kommentieren, dass ein Downvote erklärt werden sollte. Sie haben auch geschrieben "Sie müssen eine SINGLE CHARACTER-Variable als Cursor verwenden!" <- Sie meinen als Index nicht als Cursor barlop vor 9 Jahren 0
Beachten Sie auch, dass es sich bei einer Win9X-Bootdiskette um DOS handelt (DOS 7). Und noch immer soll Windows 9X unter DOS laufen. Ich könnte sagen, es war msdos.sys wie bootscan = 0 und bootgui = 0, die das Booten in Windows stoppen und direkt an eine DOS-Eingabeaufforderung booten würden. barlop vor 9 Jahren 1
0
heavyd

Überprüfen Sie die Microsoft-Dokumentation zum Befehl FOR batch . Sie können FOR verwenden, um eine Reihe von Verzeichnissen, Dateien in einem Verzeichnis oder Dateien in einem Verzeichnis und allen seinen Unterverzeichnissen zu durchlaufen.

Standardmäßig werden für FOR Handles gesetzt oder nur Dateien:

FOR %f IN (*.txt) DO ECHO %f 

Oder rekursiv:

FOR /R %f IN (*.txt) DO ECHO %f 

oder nur für Verzeichnisse:

FOR /D %d DO ECHO %d 
Leider sind alle diese Optionen in ihrem jeweiligen Umfang umfassend. Ich mache Entwicklungsarbeit, und wegen der komplexen Natur der Anwendung muss ich jedes Mal einen Build testen (was häufig der Fall ist), und ich muss fünf Dateien aus dem Build-Binär-Verzeichnis in das Binär-Installationsverzeichnis kopieren. Das wird langweilig. Momentan habe ich die Dateinamen in meinem Batch-Skript fest codiert, aber ich möchte sie in ein Array einfügen, um die Pflege des Skripts zu erleichtern. Jim Fell vor 13 Jahren 0
0
Linker3000

Für das, was Sie tun möchten, wie wäre es mit einer Eingabevariable für jeden Dateinamen, die Sie mit den Variablen% 1% 2 usw. abrufen können, z. B. mybat.bat file1.nam file2.nam usw.

Sie können diese Variablen dann in einer Schleife verwenden, müssen jedoch nur% 1 als Hauptparameter verwenden, da Sie mit SHIFT die anderen Variablen in die Position% 1 bringen können und einen Test auf null (Ende der Variablen) durchführen wie WENN "X% 1" == "X"

z.B:

:LOOP IF "X%1" == "X" GOTO DONE COPY %1 C:\TARGET.DIR SHIFT GOTO LOOP :DONE 
0
Neal

Wenn Sie die Liste der Dateien in FORder Datei filelist.txt speichern, können Sie jede Zeile der Datei lesen und verarbeiten, z. B.

FOR /F "delims=|" %i IN (filelist.txt) DO @echo %i 

Um jede Zeile einer Datei zu drucken (bis zum ersten "|" in der Zeile. Wenn Sie kein eigenes Trennzeichen angeben, werden Leerzeichen und Tabulatoren verwendet. Wenn Ihre Pfade keine Leerzeichen enthalten, müssen Sie ein Zeichen angeben das wird nicht in der Datei erscheinen, um vollständige Zeilen zu erhalten).

for / f ist eigentlich ein Windows 2000-Feature. Es ist nicht in DOS. wendy.krieger vor 10 Jahren 0
0
lorenzog

In einem Ihrer Kommentare zu einer Antwort sagen Sie:

Ich mache Entwicklungsarbeit, und wegen der komplexen Natur der Anwendung muss ich jedes Mal einen Build testen (was häufig der Fall ist), und ich muss fünf Dateien aus dem Build-Binär-Verzeichnis in das Binär-Installationsverzeichnis kopieren. Das wird langweilig. Momentan habe ich die Dateinamen in meinem Batch-Skript fest codiert, aber ich möchte sie in ein Array einfügen, um die Pflege des Skripts zu erleichtern.

Ich glaube, was Sie suchen, ist ein Makefile, und möglicherweise Cygwin, um Ihnen eine anständige Schale (bash oder was auch immer Ihr Geschmack) zu geben.

0
mordex

Ersetzen Sie Strings und Buchstaben im Text.

Versuchen Sie eine Schleife, indem Sie den Text zu einem for body erweitern und var durch var ersetzen. Ziehen Sie die Textdatei mit Drag & Drop, sodass% 1 durch Aufrufen des Befehls set eine Benutzereingabe ist.

@echo off setlocal EnableDelayedExpansion set /p a= enter letter to change: set /p b= letter to change to: set /p input=<%1 for /f %%c in ("!input:~!") do ( set "code=!input:%a%=%b%!" echo !code!>myfile.txt )