¿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 archivo para procesar. Realmente me gustaría mantener esto lo más simple posible. Gracias.
¿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 archivo para procesar. Realmente me gustaría mantener esto lo más simple posible. Gracias.
Respuestas:
Me lo imaginé:
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%
Hice algo como esto hace varios años, así que solo me costó un poco descubrirlo. (por cierto, odio reinventar la rueda). Ahora que está publicado aquí, espero que otros también lo encuentren útil.
()
sintaxis.
FILE_LIST[0]
.
Sí, puedes hacer matrices en lote. Si bien no son exactamente como matrices 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
Desde el blog de Jakash3, Arrays in Batch describe cómo emular arrays en el símbolo del sistema.
Un archivo por lotes llamado array.bat se incluye en el artículo, que contiene una biblioteca de funciones utilizadas para manejar matrices. Deberá seleccionar el texto en el 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 el siguiente resultado:
Esto llena una matriz y la imprime
¡Puede usar nombres1 nombres2 nombres3, en lugar de nombres [1] nombres [2] nombres [3] escribiendo nombres! I! en lugar de nombres [! i!]. Produce la matriz generando nombres de variables. No hay una estructura de matriz en lote. Pero es tan ordenado como cualquier estructura de matriz, y rellenar o imprimir se ve exactamente como se llenaría o imprimiría una matriz en un lenguaje adecuado (¡que en realidad tiene la estructura de matriz!)
@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 evitar un comportamiento extraño, de modo que las variables se comporten correctamente cuando están dentro de un FOR o un IF. Es una rareza con los archivos por lotes. Vea set /?
dónde se menciona más adelante.
Esto es lo que puebla la matriz, y es bastante sencillo para cualquiera que sepa sobre matrices. También podría hacerlo, names[0]=bob
names[1]=tom
names[2]=joseph
aunque una de las bellezas de una matriz es la capacidad de llenar una matriz 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 la matriz. %% f si lo repite, verá que irá de 0 al último índice de la matriz, en los pasos de 1. así que imprimirá nombres [0] nombres [1] nombres [2]
for /L %%f in (0,1,!lastindex!) do (
echo !names[%%f]!
)
Para lo que desea hacer, ¿qué tal usar una variable de entrada para cada nombre de archivo, que puede elegir con las variables% 1% 2 etc., por ejemplo: mybat.bat file1.nam file2.nam, etc.
Luego puede usar estas variables en un bucle, pero solo necesita usar% 1 como parámetro principal, ya que puede usar SHIFT para llevar las otras variables a la 'posición'% 1, con una prueba de nulo (final de variables) con algo como SI "X% 1" == "X"
p.ej:
:LOOP
IF "X%1" == "X" GOTO DONE
COPY %1 C:\TARGET.DIR
SHIFT
GOTO LOOP
:DONE
Si guarda la lista de archivos en filelist.txt, puede FOR
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 "|" en la línea. Si no especifica su propio delimitador, se utilizarán espacios y tabulaciones, por lo que a menos que sus rutas no tengan espacios, debe especificar un carácter que no aparecerá en el archivo para obtener líneas completas).
En uno de sus comentarios a una respuesta, usted dice:
Estoy haciendo trabajo de desarrollo, y debido a la naturaleza compleja de la aplicación cada vez y quiero probar una compilación (que a menudo es así) 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 archivo codificados en mi script por lotes, pero me gustaría ponerlos en una matriz para que el script sea más fácil de mantener.
Creo que lo que está buscando es un Makefile, y posiblemente cygwin para darle un caparazón decente (bash, o cualquier sabor que tenga).
Reemplazar cadenas y letras en el texto.
Pruebe bucle expandiendo el texto a un cuerpo for y reemplazando var con var. Arrastre y suelte el archivo de texto para que% 1 sea introducido por el 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
)
¿Algo así en un archivo por lotes? Seleccione un archivo en una carpeta. << es 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
Realmente no puede hacer una matriz en el símbolo del sistema (y tampoco 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 para procesar, puede crear manualmente un archivo de texto para procesar, o usar el dir /b <mask>
comando dentro del bucle FOR.
Algo que aprendí por las malas con FOR: ¡necesitas usar una variable de CARÁCTER SIMPLE como cursor!
Consulte la documentación de Microsoft en el comando por lotes FOR . Puede usar 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 conjuntos o solo archivos:
FOR %f IN (*.txt) DO ECHO %f
O, para recursivo:
FOR /R %f IN (*.txt) DO ECHO %f
o, solo para directorios:
FOR /D %d DO ECHO %d
Este es un pequeño archivo de depuración que hice un tiempo para probar la matriz de mi juego de tic tac tow en BATCH / CMD. puede leer y escribir desde y hacia una matriz sin llegar a ser grande y complicado en el código.
usarlo es simple:
Escribir en una matriz
Leer desde una matriz
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