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.
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.
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.
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
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:
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]=bob
names[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]!
)
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
)
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!
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
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
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).
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
Lezen uit een array
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
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).
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