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

Array vullen in DOS Batch Script

Hoe kan ik een array variabele instellen in een DOS batch script? Ik zou het willen laden met een lijst van bestandsnamen om te verwerken. Ik zou dit echt zo simpel mogelijk willen houden. Dank u.

Antwoorden (12)

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

Ik heb het uitgezocht:

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%

Ik heb zoiets al een paar jaar geleden gedaan, dus het kostte alleen wat uitzoekwerk. (btw, ik haat het om het wiel opnieuw uit te vinden.) Nu dat het hier gepost is, zullen anderen het hopelijk ook nuttig vinden.

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

Ja, je kan arrays maken in batch. Hoewel ze niet precies zijn zoals arrays in C of VB, KAN je het doen:

@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

Van Jakash3’s Blog, Arrays in Batch beschrijft hoe je arrays kunt emuleren in de command prompt.

Het artikel bevat een batch-bestand met de naam array.bat, dat een bibliotheek bevat met functies die gebruikt worden om met arrays om te gaan. Je zult de tekst uit het artikel moeten selecteren en in het bat-bestand plakken.

Bijvoorbeeld het volgende testscript:

@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%.

genereert de volgende uitvoer:

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

Dit vult een array en drukt het af

Je zou names1 names2 names3 kunnen gebruiken, in plaats van names[1] names[2] names[3] door names!i! te schrijven in plaats van names[!i!]. Het produceert de array door variabele namen te genereren. Er is geen array structuur in batch. Maar het is net zo netjes als elke andere array-structuur, en het vullen of afdrukken ziet er precies zo uit als hoe je een array zou vullen of afdrukken in een fatsoenlijke taal (die ook een array-structuur heeft!)

@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]!
)

de uitvoer-

c:\blah>a
bob
tom
joseph

c:\blah>

Wat uitleg-

De setlocal enabledelayedexpansion enableextensions met de !var! in plaats van %var% is nodig om vreemd gedrag te voorkomen, zodat variabelen zich goed gedragen als ze binnen een FOR of een IF staan. Het is een rariteit met batch-bestanden. Zie set /? waar dat verder wordt vermeld.

Dit is wat de array vult, en is vrij eenvoudig voor iedereen die iets van arrays weet. Je zou ook names[0]=bobnames[1]=tom names[2]=joseph kunnen doen, maar een van de schoonheden van een array is de mogelijkheid om een array te vullen met een lus, wat ik hier heb gedaan.

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

Dit geeft de array weer. %%f als je het echoot zou je zien dat het van 0 tot de laatste index van de array gaat, in stappen van 1. dus zal namen[0] namen[1] namen[2]

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

Tekenreeksen en letters in tekst vervangen.

Probeer for-lus door tekst uit te breiden tot een for-lus en var te vervangen door var. Sleep tekstbestand zodat %1 gebruikersinvoer is door set-commando aan te roepen.

@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

Je kunt niet echt een array maken in de opdrachtprompt (en het is ook niet echt DOS, tenzij je Windows 3.1 draait). Je kunt echter wel op sets gebaseerde verwerking doen met het FOR commando.

Om de lijst met te verwerken bestanden te maken, kun je handmatig een tekstbestand maken dat verwerkt moet worden, of het dir /b <mask> commando binnen de FOR-lus gebruiken.

Iets wat ik op de harde manier geleerd heb met FOR - je moet een SINGLE CHARACTER variabele gebruiken als cursor!

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

Wat dacht je ervan om een input variabele te gebruiken voor elke bestandsnaam, die je kan ophalen met de %1 %2 etc. variabelen bv: mybat.bat file1.nam file2.nam etc..

Je kunt deze variabelen dan in een lus gebruiken, maar je hoeft alleen %1 als hoofdparameter te gebruiken, omdat je SHIFT kunt gebruiken om de andere variabelen in de %1 ‘positie’ te brengen, met een test voor null (einde van variabelen) met iets als IF “X%1” == “X”

bijv:

: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

Raadpleeg de Microsoft-documentatie over de batchopdracht FOR . U kunt FOR gebruiken om een reeks mappen, bestanden in een map, of bestanden in een map en alle submappen ervan te doorlopen.

Standaard behandelt FOR een set of alleen bestanden:

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

Of, voor recursief:

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

of, voor alleen mappen:

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

Als je de lijst met bestanden opslaat in filelist.txt, kun je FOR krijgen om elke regel van het bestand te lezen en te verwerken, zoals

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

om elke regel van een bestand af te drukken (tot de eerste “|” in de regel. Als u geen eigen scheidingsteken opgeeft, zullen spaties en tabs worden gebruikt, dus tenzij uw paden geen spaties bevatten, moet u een teken opgeven dat niet in het bestand voorkomt om volledige regels te krijgen).

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

dit is een klein debug bestand dat ik een tijdje geleden heb gemaakt om de array van mijn tic tac tow spel te testen in BATCH / CMD. het kan lezen en schrijven naar en van een array zonder dat het te groot en ingewikkeld wordt voor de code.

het gebruik ervan is eenvoudig:

schrijven naar een array

  1. geef het een bestand of pas het aan om iets anders te importeren.
  2. geef de array een naam.
  3. en je bent klaar.

Lezen uit een array

  1. Geef de grootte van de array of een deel ervan dat je wilt lezen.
  2. Geef de naam van de array met %%a in de naam
  3. en klaar.

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 een van je commentaren op een antwoord zeg je,

Ik doe ontwikkelingswerk, en door de complexe aard van de applicatie moet ik elke keer als ik een build wil testen (en dat is vaak) vijf bestanden kopiëren van de build binary directory naar de install binary directory. Dit wordt vervelend. Op dit moment heb ik de bestandsnamen hard gecodeerd in mijn batch script, maar ik zou ze in een array willen zetten om het script makkelijker te onderhouden te maken.

Ik denk dat wat je zoekt een Makefile is, en mogelijk cygwin om je een fatsoenlijke shell te geven (bash, of wat je smaak ook is).

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

Zoiets als dit in een batch-bestand? Selecteer een bestand in een map. <<<< is commentaar, geen 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