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

Populating Array em DOS Batch Script

Como posso configurar uma variável de matriz num script de lote DOS? Gostaria de a carregar com uma lista de nomes de ficheiros a processar. Gostaria realmente de manter isto tão simples quanto possível. Obrigado.

Respostas (12)

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

Descobri-o:

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%

Fiz algo assim há vários anos atrás, por isso foi preciso apenas descobrir alguma coisa. (btw, odeio reinventar a roda.) Agora que está afixada aqui, esperemos que outros também a considerem útil.

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

Sim, pode fazer matrizes em lote. Embora não sejam exactamente como as matrizes em C ou VB, pode fazê-lo:

@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

Do Blog de Jakash3, Arrays in Batch descreve como emular arrays no prompt de comando.

Um ficheiro de lote chamado array.bat está incluído no artigo, que contém uma biblioteca de funções utilizadas para lidar com arrays. Será necessário seleccionar o texto no artigo e colá-lo dentro do ficheiro bat.

Por exemplo, o seguinte guião de teste:

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

gera o seguinte resultado:

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

Isto preenche um array e imprime-o

Poderia usar nomes1 nomes2 nomes3, em vez de nomes[1] nomes[2] nomes[3] escrevendo nomes!i! em vez de nomes[!i!]. Produz a matriz através da geração de nomes variáveis. Não existe uma estrutura de array em lote. Mas é tão puro como qualquer estrutura de array, e o preenchimento ou impressão parece exactamente como se preenchia ou imprime um array numa linguagem apropriada (que na realidade tem a estrutura 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]!
)

a saída-

c:\blah>a
bob
tom
joseph

c:\blah>

Algumas explicações-

O setlocal enabledelayedexpansion enableextensions com o !var! em vez de %var% é necessário para evitar comportamentos estranhos, de modo a que as variáveis se comportem correctamente quando dentro de um FOR ou IF. É uma estranheza com ficheiros de lotes. Ver set /? onde isso é mencionado mais adiante.

Isto é o que povoa o array, e é bastante directo para qualquer pessoa que conheça os arrays. Também se poderia fazer names[0]=bobnames[1]=tom names[2]=joseph embora uma das belezas de um array seja a capacidade de preencher um array com um loop, que é o que eu fiz aqui.

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

Isto mostra o array. %%f se o ecoar vai de 0 até ao último índice do array, em passos de 1. assim imprimirá nomes[0] nomes[1] nomes[2]

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

Substituir cordas e letra em texto.

Tente fazer um loop, expandindo o texto para um for body e substituindo var por var. Arraste e largue o ficheiro de texto, de modo a que %1 seja introduzido pelo utilizador, invocando o 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

Não pode realmente fazer um array no prompt de comando (e também não é realmente DOS a menos que esteja a correr o Windows 3.1). Contudo, pode fazer processamento baseado em set com o comando FOR.

Para criar a lista de ficheiros a processar, pode criar manualmente um ficheiro de texto a ser processado, ou usar o comando dir /b <mask> dentro do laço FOR.

Algo que aprendi da maneira mais difícil com FOR - precisa de usar uma variável SINGLE CHARACTER como o seu cursor!

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

Para o que pretende fazer, que tal utilizar uma variável de entrada para cada nome de ficheiro, que pode apanhar com as variáveis %1 %2 etc., por exemplo: mybat.bat file1.nam file2.nam etc..

Pode então utilizar estas variáveis num laço, mas só precisa de usar %1 como parâmetro principal, pois pode usar SHIFT para trazer as outras variáveis para a ‘posição’ de %1, tendo um teste de nulo (fim de variáveis) com 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 a documentação da Microsoft no FOR batch command . Pode usar FOR para iterar sobre um conjunto de directórios, ficheiros num directório, ou ficheiros num directório e todos os seus subdirectórios.

Por defeito FOR handles set ou apenas ficheiros:

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

Ou, para recursivo:

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

ou, para apenas directórios:

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

Se guardar a lista de ficheiros em filelist.txt, pode obter FOR para ler e processar cada linha do ficheiro, tais como

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

para imprimir cada linha de um ficheiro (até ao primeiro “|” na linha. Se não especificar o seu próprio delimitador, será utilizado espaço e separador, portanto, a menos que os seus caminhos não tenham espaços, terá de especificar um carácter que não aparecerá no ficheiro para obter linhas completas).

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

este é um pequeno ficheiro de depuração que fiz durante algum tempo para testar a matriz do meu jogo tic tac tow em BATCH / CMD. ele pode ler e escrever de e para uma matriz sem ir para grande e complicado no código.

usando-o é simples:

Escrevendo para um array

  1. dar-lhe um ficheiro ou modificá-lo para importar algo mais.
  2. dar um nome ao array.
  3. e o seu feito.

Leitura de um array

  1. Dê o tamanho do array ou parte dele que quer ler.
  2. Coloque no nome da matriz com %%a no nome
  3. e está feito.

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

Num dos vossos comentários a uma resposta que dizem,

Estou a fazer trabalho de desenvolvimento, e devido à natureza complexa da aplicação de cada vez e quero testar uma compilação (que é frequentemente) tenho de copiar cinco ficheiros do directório binário de compilação para o directório binário de instalação. Isto torna-se enfadonho. Neste momento, tenho os nomes dos ficheiros codificados no meu script de lote, mas gostaria de os colocar num array para tornar o script mais fácil de manter.

Creio que o que procura é um Makefile, e possivelmente um cygwin para lhe dar uma concha decente (bash, ou qualquer que seja o seu sabor).

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

Algo parecido com isto num ficheiro de lote? Seleccione um ficheiro numa pasta. << é um comentário, sem 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