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

Rellenar una matriz en un script por lotes de DOS

¿Cómo puedo configurar una variable de matriz en un script por lotes de DOS? Me gustaría cargarlo con una lista de nombres de archivos para procesar. Realmente me gustaría mantener esto tan simple como sea posible. Gracias.

Respuestas (12)

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

Lo he resuelto:

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%

Ya hice algo así hace varios años, así que sólo me costó un poco de trabajo. (btw, odio reinventar la rueda.) Ahora que está publicado aquí, espero que otros lo encuentren útil también.

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

Sí, puedes hacer arrays por lotes. Aunque no son exactamente como los arrays en C o VB, puedes hacerlo:

@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

Del Blog de Jakash3, Arrays in Batch describe cómo emular arrays en el prompt de comandos.

En el artículo se incluye un archivo batch llamado array.bat, que contiene una librería de funciones utilizadas para manejar arrays. Tendrás que seleccionar el texto del artículo y pegarlo dentro del archivo bat.

Por ejemplo, el siguiente script de prueba:

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

genera la siguiente salida:

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

Esto rellena un array y lo imprime

Podrías usar nombres1 nombres2 nombres3, en lugar de nombres[1] nombres[2] nombres[3] escribiendo nombres!i! en lugar de nombres[!i!]. Produce el array generando nombres de variables. No hay una estructura de array en el lote. Pero es tan limpio como cualquier estructura de array, y rellenar o imprimir se ve exactamente como uno rellenaría o imprimiría un array en un lenguaje apropiado (¡que realmente tiene la estructura de array!)

@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 salida-

c:\blah>a
bob
tom
joseph

c:\blah>

Alguna explicación-

El setlocal enabledelayedexpansion enableextensions con el !var! en lugar de %var% es necesario para prevenir un comportamiento extraño, para que las variables se comporten correctamente cuando están dentro de un FOR o un IF. Es una rareza con los archivos batch. Ver set /? donde se menciona más adelante.

Esto es lo que rellena el array, y es bastante sencillo para cualquiera que sepa de arrays. También podrías hacer names[0]=bobnames[1]=tom names[2]=joseph aunque una de las bellezas de un array es la capacidad de rellenar un array con un bucle, que es lo que he hecho aquí.

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

Esto muestra el array. Si lo haces eco, verás que irá de 0 al último índice del array, en pasos de 1. Así imprimirá nombres[0] nombres[1] nombres[2]

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

Reemplazar cadenas y letras en el texto.

Prueba el bucle for expandiendo el texto a un cuerpo for y reemplazando var por var. Arrastra y suelta el archivo de texto para que %1 sea la entrada del usuario invocando el comando 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

No se puede realmente hacer un conjunto en el símbolo del sistema (y además no es realmente DOS a menos que esté ejecutando Windows 3.1). Sin embargo, puede hacer un procesamiento basado en conjuntos con el comando FOR.

Para crear la lista de archivos a procesar, puede crear manualmente un archivo de texto a procesar, o usar el comando dir /b <mask> dentro del bucle FOR.

Algo que aprendí de la manera más difícil con FOR - ¡necesitas usar una variable SINGLE CHARACTER como tu cursor!

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

Para lo que quieres hacer, qué tal si usas una variable de entrada para cada nombre de archivo, que puedes recoger con las variables %1 %2 etc. ej: mybat.bat file1.nam file2.nam etc..

Luego puedes usar estas variables en un bucle pero sólo necesitas usar %1 como parámetro principal ya que puedes usar SHIFT para llevar las otras variables a la ‘posición’ de %1, teniendo un test para null (fin de variables) con algo como 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

Consulte la documentación de Microsoft sobre el comando FOR batch . Puede utilizar FOR para iterar sobre un conjunto de directorios, archivos en un directorio, o archivos en un directorio y todos sus subdirectorios.

Por defecto FOR maneja el conjunto o sólo los archivos:

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

O, para recursivo:

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

o, para sólo directorios:

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

Si guarda la lista de archivos en filelist.txt, puede obtener FOR para leer y procesar cada línea del archivo, como

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

para imprimir cada línea de un archivo (hasta el primer “|” de la línea. Si no especifica su propio delimitador, se usará el espacio y el tabulador, así que a menos que sus rutas no tengan espacios, necesita especificar un carácter que no aparezca en el archivo para obtener líneas completas).

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

este es un pequeño archivo de depuración que hice hace un tiempo para probar el array de mi juego de tic tac tow en BATCH / CMD. puede leer y escribir en y desde un array sin complicarse demasiado en el código.

usarlo es sencillo:

escribir en un array

  1. darle un archivo o modificarlo para importar algo más.
  2. dale un nombre al array.
  3. y ya está.

Lectura de un array

  1. Dar el tamaño del array o parte de él que se quiere leer.
  2. Poner el nombre del array con %%a en el nombre
  3. y ya está.

Código:

@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

En uno de tus comentarios a una respuesta dices,

Estoy haciendo un trabajo de desarrollo, y debido a la naturaleza compleja de la aplicación cada vez que quiero probar una compilación (que es a menudo) tengo que copiar cinco archivos del directorio binario de compilación al directorio binario de instalación. Esto se vuelve tedioso. En este momento, tengo los nombres de los archivos codificados en mi secuencia de comandos por lotes, pero me gustaría ponerlos en una matriz para hacer el script más fácil de mantener.

Creo que lo que estás buscando es un Makefile, y posiblemente cygwin para darte un shell decente (bash, o cualquiera que sea tu sabor).

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

¿Algo así en un archivo por lotes? Seleccione un archivo en una carpeta. \N - es un comentario, sin código

: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