2010-09-21 18:44:45 +0000 2010-09-21 18:44:45 +0000
34
34

Array im DOS-Batch-Skript auffüllen

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. Ich danke Ihnen.

Antworten (12)

48
48
48
2010-09-21 20:58:31 +0000

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 so etwas schon vor einigen Jahren gemacht, es hat also nur etwas Überwindung gekostet. (btw, ich hasse es, das Rad neu zu erfinden.) Jetzt, wo es hier gepostet ist, werden es hoffentlich auch andere nützlich finden.

13
13
13
2013-02-18 23:27:03 +0000

Ja, Sie können Arrays in Batch ausführen. Sie sind zwar nicht genau wie Arrays in C oder VB, aber Sie KÖNNEN 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
7
7
7
2010-09-21 20:48:19 +0000

Aus dem Blog von Jakash3, Arrays in Batch beschreibt, wie man Arrays in der Eingabeaufforderung emulieren kann.

Im Artikel ist eine Batch-Datei namens array.bat enthalten, die eine Bibliothek von Funktionen zur Handhabung von Arrays enthält. Sie müssen den Text im Artikel markieren und in die Batch-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:

4
4
4
2014-08-29 11:53:30 +0000

Dies füllt ein Array auf und gibt es

Sie könnten statt names[1] names[2] names[3] auch names1 names2 names3 verwenden, indem Sie names!i! anstelle von names[!i!] schreiben. Das Array wird durch die Generierung von Variablennamen erzeugt. Es gibt keine Array-Struktur in Batch. Aber es ist so ordentlich wie jede Array-Struktur, und das Auffüllen oder Ausdrucken sieht genau so aus, wie man ein Array in einer richtigen Sprache auffüllen oder ausdrucken würde (die tatsächlich eine 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ärungen-

Das setlocal enabledelayedexpansion enableextensions mit dem !var! anstatt %var% ist notwendig, um ein seltsames Verhalten zu verhindern, so dass sich Variablen innerhalb eines FOR oder IF richtig verhalten. Es ist eine Merkwürdigkeit bei Batch-Dateien. Siehe set /?, wo das weiter erwähnt wird.

Dies füllt das Array auf und ist ziemlich einfach für jeden, der sich mit Arrays auskennt. Sie könnten auch names[0]=bobnames[1]=tom names[2]=joseph machen, obwohl eine der Schönheiten eines Arrays die Fähigkeit ist, ein Array mit einer Schleife aufzufüllen, was ich hier gemacht 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 es als Echo ausgeben, werden Sie sehen, dass es von 0 bis zum letzten Index des Arrays geht, in Schritten von 1. also wird names[0] names[1] names[2]

for /L %%f in (0,1,!lastindex!) do ( 
  echo !names[%%f]!
)
``` gedruckt
0
0
0
2014-05-01 20:03:34 +0000

Ersetzen von Zeichenketten und Buchstaben im Text.

Versuchen Sie eine for-Schleife, indem Sie den Text zu einem for-Body erweitern und var durch var ersetzen. Ziehen Sie eine Textdatei so, dass %1 eine Benutzereingabe ist, indem Sie den Befehl set aufrufen.

@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
)
0
0
0
2010-09-21 18:53:17 +0000

Sie können nicht wirklich ein Array in der Eingabeaufforderung ausführen (und es ist auch nicht wirklich DOS, es sei denn, Sie verwenden Windows 3.1). Sie können jedoch eine mengenbasierte Verarbeitung mit dem FOR-Befehl

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

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

0
0
0
2010-09-21 19:42:14 +0000

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

Sie können diese Variablen dann in einer Schleife verwenden, müssen aber nur %1 als Hauptparameter verwenden, da Sie mit SHIFT die anderen Variablen in die %1 ‘Position’ bringen können, mit einem Test auf Null (Ende der Variablen) mit etwas wie IF “X%1” == “X”

z.B.:

:LOOP
IF "X%1" == "X" GOTO DONE
COPY %1 C:\TARGET.DIR
SHIFT
GOTO LOOP
:DONE
0
0
0
2010-09-21 19:07:50 +0000

Sehen Sie sich die Microsoft-Dokumentation zum FOR-Batch-Befehl an. Sie können FOR verwenden, um über einen Satz von Verzeichnissen, Dateien in einem Verzeichnis oder Dateien in einem Verzeichnis und allen seinen Unterverzeichnissen zu iterieren.

Standardmäßig behandelt FOR einen Satz oder nur Dateien:

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

Oder, für rekursiv:

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

oder, für nur Verzeichnisse:

FOR /D %d DO ECHO %d
0
0
0
2010-09-21 20:04:48 +0000

Wenn Sie die Liste der Dateien in filelist.txt speichern, können Sie FOR verwenden, um jede Zeile der Datei zu lesen und zu 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 Tabulator verwendet. Wenn Ihre Pfade also keine Leerzeichen haben, müssen Sie ein Zeichen angeben, das nicht in der Datei erscheint, um vollständige Zeilen zu erhalten).

0
0
0
2016-08-16 12:37:34 +0000

Dies ist eine kleine Debug-Datei, die ich vor einer Weile gemacht habe, um das Array aus meinem Tic Tac Tow Spiel in BATCH / CMD zu testen. Es kann lesen und schreiben in und aus einem Array whitout gehen zu groß und kompliziert auf den Code.

Die Benutzung ist einfach:

Schreiben in ein Array

  1. geben Sie ihm eine Datei oder modifizieren Sie es, um etwas anderes zu importieren.
  2. Geben Sie dem Array einen Namen.
  3. und das war’s.

Lesen aus einem Array

  1. Geben Sie die Größe des Arrays oder eines Teils des Arrays an, das Sie lesen möchten.
  2. Geben Sie den Namen des Arrays mit %%a im Namen ein
  3. und Sie sind fertig.

Code:

@echo off
setlocal EnableDelayedExpansion

set ID=0

:: Reader ::
:: It reads the file called input.txt ::
:: and stores it in a new variable that ::
:: for everytime it goes over it it is a ::
:: new ID (Slot in the array). ::

For /F %%A in (input.txt) do ( 
    set /a ID=ID+1
    set Input!ID!= %%A

    echo !ID! : %%A
)

:: Writer ::
:: this is to read all Slots in the array ::
:: and puts it on the screen. ::

for /L %%a in (1,1,!ID!) do (
    echo !Input%%a!
)
pause>nul
0
0
0
2010-09-21 20:11:25 +0000

In einem Ihrer Kommentare zu einer Antwort sagen Sie:

Ich mache Entwicklungsarbeit, und aufgrund der komplexen Natur der Anwendung muss ich jedes Mal, wenn ich einen Build testen möchte (was oft vorkommt), fünf Dateien aus dem Build-Binärverzeichnis in das Install-Binärverzeichnis kopieren. Das wird mühsam. Im Moment habe ich die Dateinamen fest in mein Batch-Skript kodiert, aber ich würde sie gerne in ein Array einfügen, um das Skript einfacher zu pflegen.

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

0
0
0
2014-08-28 20:57:17 +0000

So etwas in einer Batch-Datei? Wählen Sie eine Datei in einem Ordner aus. << ist Kommentar, kein Code

:selectapk
SETLOCAL ENABLEDELAYEDEXPANSION << DELAYED EXPANSION on for counter in For loop
SET /A MAXITEM=0
Echo.
Echo Found these APK files in "add_apk_here" folder.
Echo.
For %%a in (add_apk_here/*.apk) do (
 Set /A MAXITEM+=1
 Set MENUITEM!MAXITEM!=%%a << Fill n local env vars, one for each file, called MENUITEM1...n
 Echo !MAXITEM!. %%a
)
Echo.
If !MAXITEM!==0 Echo No APK in "add_apk_here" folder & call :delay & Goto start << No apk files then go back
SET /P CHOICE=Select APK to work on: 
SET MENUITEM=!MENUITEM%CHOICE%! << Get the stored filename from MENUITEMx
SETLOCAL DISABLEDELAYEDEXPANSION << Very important for next ENDLOCAL that doesn't like the delayedexpansion var
ENDLOCAL & SET apk=%MENUITEM% << put the local MENUITEM var into the global apk var
goto start

:delay
REM %1 like Call :delay 5
SETLOCAL
SET N=%1
If Not Defined N Set N=2
Ping -n %N% -w 1000 127.255.255.255 > nul
ENDLOCAL
Exit /b