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

Remplir le tableau dans le script DOS Batch

Comment puis-je configurer une variable de tableau dans un script DOS en mode batch ? Je voudrais la charger avec une liste de noms de fichiers à traiter. J'aimerais vraiment que cela reste aussi simple que possible. Je vous remercie.

Risposte (12)

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

Je l'ai compris :

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%

J'ai fait quelque chose comme ça il y a plusieurs années, alors il a fallu que je trouve une solution. Maintenant qu'il est publié ici, j'espère que d'autres le trouveront utile.

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

Oui, vous pouvez faire des tableaux par lots. Bien qu'ils ne soient pas exactement comme les tableaux en C ou VB, vous POUVEZ le faire :

@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

Sur le blog de Jakash3, Arrays in Batch décrit comment émuler des tableaux dans l'invite de commande.

Un fichier batch nommé array.bat est inclus dans l'article, qui contient une bibliothèque de fonctions utilisées pour gérer les tableaux. Vous devrez sélectionner le texte dans l'article et le coller dans le fichier bat.

Par exemple, le script de test suivant :

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

génère la sortie suivante :

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

Cela remplit un tableau et l'imprime

Vous pourriez utiliser des noms1 noms2 noms3, plutôt que des noms [1] noms [2] noms [3] en écrivant des noms!i ! au lieu de noms[!i !]. Il produit le tableau en générant des noms de variables. Il n'y a pas de structure de tableau en lot. Mais elle est aussi soignée que n'importe quelle structure de tableau, et le remplissage ou l'impression ressemble exactement à la façon dont on remplirait ou imprimerait un tableau dans un langage propre (qui a en fait la structure de tableau !)

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

la sortie -

c:\blah>a
bob
tom
joseph

c:\blah>

une explication -

Le setlocal enabledelayedexpansion enableextensions avec le !var ! plutôt que %var% est nécessaire pour éviter les comportements bizarres, de sorte que les variables se comportent correctement lorsqu'elles sont dans un FOR ou un IF. C'est une bizarrerie avec les fichiers batch. Voir set /? où cela est mentionné plus loin.

C'est ce qui remplit le tableau, et c'est assez simple pour quiconque s'y connaît en matière de tableaux. Vous pouvez aussi faire names[0]=bobnames[1]=tom names[2]=joseph bien que l'une des beautés d'un tableau soit la possibilité de le remplir avec une boucle, ce que j'ai fait ici.

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

Ceci affiche le tableau. %%f si vous le faites résonner, vous verrez qu'il ira de 0 au dernier index du tableau, par pas de 1. Il affichera donc les noms [0] noms [1] noms [2]

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

Remplacez les chaînes et les lettres dans le texte.

Essayez de faire une boucle en développant le texte en a pour corps et en remplaçant var par var. Glissez-déposez le fichier texte pour que %1 soit saisi par l'utilisateur en invoquant la commande set.

@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

Vous ne pouvez pas vraiment faire un tableau dans l'invite de commande (et aussi ce n'est pas vraiment DOS à moins que vous ne soyez sous Windows 3.1). Cependant, vous pouvez effectuer un traitement basé sur des jeux de données avec la commande FOR.

Pour créer la liste des fichiers à traiter, vous pouvez créer manuellement un fichier texte à traiter, ou utiliser la commande dir /b <mask> à l'intérieur de la boucle FOR.

Quelque chose que j'ai appris à la dure avec FOR - vous devez utiliser une variable SINGLE CHARACTER comme curseur !

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

Pour ce que vous voulez faire, pourquoi ne pas utiliser une variable d'entrée pour chaque nom de fichier, que vous pouvez récupérer avec les variables %1 %2 etc. par exemple : mybat.bat fichier1.nam fichier2.nam etc.

Vous pouvez alors utiliser ces variables dans une boucle mais vous devez seulement utiliser %1 comme paramètre principal car vous pouvez utiliser SHIFT pour amener les autres variables à la “position” %1, en ayant un test pour le nul (fin des variables) avec quelque chose comme IF “X%1” == “X”

eg :

: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

Consultez la documentation Microsoft sur la commande FOR batch command . Vous pouvez utiliser FOR pour itérer sur un ensemble de répertoires, de fichiers dans un répertoire, ou de fichiers dans un répertoire et tous ses sous-répertoires.

Par défaut, FOR gère l'ensemble ou seulement les fichiers :

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

Ou, pour récursif :

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

ou, pour les répertoires seulement :

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

Si vous enregistrez la liste des fichiers sur filelist.txt, vous pouvez obtenir FOR pour lire et traiter chaque ligne du fichier, comme

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

pour imprimer chaque ligne d'un fichier (jusqu'au premier “|” de la ligne. Si vous ne spécifiez pas votre propre délimiteur, les espaces et la tabulation seront utilisés, donc à moins que vos chemins n'aient pas d'espaces, vous devez spécifier un caractère qui n'apparaîtra pas dans le fichier pour obtenir des lignes complètes).

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

C'est un petit fichier de débogage que j'ai fait un peu pour tester le tableau de mon jeu tic tac tow en BATCH / CMD. Il peut lire et écrire dans et à partir d'un tableau sans que le code ne soit trop gros et compliqué.

l'utiliser est simple :

écrire dans un tableau

  1. lui donner un fichier ou le modifier pour importer autre chose.
  2. donner un nom au tableau.
  3. et c'est fait.

Lecture d'un tableau

  1. Donnez la taille du tableau ou de la partie de celui-ci que vous voulez lire.
  2. Mettez le nom du tableau avec %%a dans le nom
  3. et le tour est joué.

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

Dans un de vos commentaires à une réponse, vous dites :

Je fais du travail de développement, et en raison de la nature complexe de l'application à chaque fois et que je veux tester un build (ce qui est souvent le cas), je dois copier cinq fichiers du répertoire binaire de build vers le répertoire binaire d'installation. Cela devient fastidieux. Pour l'instant, les noms des fichiers sont codés en dur dans mon script batch, mais j'aimerais les mettre dans un tableau pour rendre le script plus facile à maintenir.

Je crois que ce que vous cherchez est un Makefile, et éventuellement cygwin pour vous donner un shell décent (bash, ou quel que soit votre goût).

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

Quelque chose comme ça dans un fichier de lot ? Sélectionnez un fichier dans un dossier. << est un commentaire, pas de 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