Preenchendo a matriz no script em lote do DOS

33

Como posso configurar uma variável de matriz em um script em lotes do DOS? Eu gostaria de carregá-lo com uma lista de nomes de arquivos para processar. Eu realmente gostaria de manter isso o mais simples possível. Obrigado.

    
por Jim Fell 21.09.2010 / 20:44

12 respostas

48

Eu descobri:

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%

Eu fiz algo parecido com isso há vários anos, então foi preciso descobrir um pouco. (a propósito, eu odeio reinventar a roda.) Agora que está postado aqui, espero que outros também achem útil.

    
por 21.09.2010 / 22:58
12

Sim, você pode fazer matrizes em lote. Enquanto eles não são exatamente como matrizes em C ou VB, você pode fazer isso:

@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
    
por 19.02.2013 / 00:27
7

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

Um arquivo em lote chamado array.bat está incluído no artigo, que contém uma biblioteca de funções usada para manipular arrays. Você precisará selecionar o texto no artigo e colá-lo dentro do arquivo bat.

Por exemplo, o seguinte script 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 a seguinte saída:

    
por 21.09.2010 / 22:48
3

Isto preenche uma matriz e imprime-a

Você poderia usar nomes1 nomes2 nomes3, em vez de nomes [1] nomes [2] nomes [3] escrevendo nomes! i! em vez de nomes [! i!]. Produz o array gerando nomes de variáveis. Não há uma estrutura de matriz em lote. Mas é tão simples quanto qualquer estrutura de array, e preencher ou imprimir tem exatamente a mesma aparência de como preencher ou imprimir uma matriz em uma linguagem apropriada (que na verdade tem a estrutura da 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]!
)

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% ser necessário para evitar comportamentos estranhos, para que as variáveis se comportem adequadamente quando dentro de um FOR ou um IF. É uma esquisitice com arquivos em lote. Veja set /? onde isso é mencionado mais adiante.

Isso é o que preenche a matriz e é bastante direto para qualquer pessoa que saiba sobre matrizes. Você também pode fazer names[0]=bob names[1]=tom names[2]=joseph , embora uma das belezas de uma matriz seja a capacidade de preencher uma matriz com um loop, que é o que fiz aqui.

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

Isso exibe a matriz. %% f se você fizer o eco que você verá, irá de 0 para o último índice da matriz, em passos de 1. assim, irá imprimir nomes [0] nomes [1] nomes [2]

for /L %%f in (0,1,!lastindex!) do ( 
  echo !names[%%f]!
)
    
por 29.08.2014 / 13:53
1

Você não pode realmente fazer uma matriz no prompt de comando (e também não é realmente o DOS, a menos que você esteja executando o Windows 3.1). No entanto, você pode fazer o processamento baseado em set com o comando FOR.

Para criar a lista de arquivos a serem processados, você pode criar manualmente um arquivo de texto a ser processado ou usar o comando dir /b <mask> dentro do loop FOR.

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

    
por 21.09.2010 / 20:53
0

Para o que você quer fazer, que tal usar uma variável de entrada para cada nome de arquivo, que você pode pegar com as variáveis% 1% 2 etc., por exemplo: mybat.bat file1.nam file2.nam etc ..

Você pode usar essas variáveis em um loop, mas só precisa usar% 1 como parâmetro principal, já que você pode usar SHIFT para trazer as outras variáveis para a% 1 'position', tendo um teste para null (fim das variáveis ) com algo como IF "X% 1" == "X"

por exemplo:

:LOOP
IF "X%1" == "X" GOTO DONE
COPY %1 C:\TARGET.DIR
SHIFT
GOTO LOOP
:DONE
    
por 21.09.2010 / 21:42
0

Se você salvar a lista de arquivos em filelist.txt, poderá obter FOR para ler e processar cada linha do arquivo, como

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

para imprimir cada linha de um arquivo (até o primeiro "|" na linha. Se você não especificar seu próprio delimitador, o espaço e a guia serão usados, portanto, a menos que seus caminhos não possuam espaços, é necessário especifique um caracter que não aparecerá no arquivo para obter linhas completas).

    
por 21.09.2010 / 22:04
0

Em um dos seus comentários para uma resposta que você diz,

I am doing development work, and due to the complex nature of the application every time and want to test a build (which is often) I have to copy five files from the build binary directory to the install binary directory. This gets tedious. Right now, I have the file names hard-coded into my batch script, but I would like to put them into an array to make the script easier to maintain.

Eu acredito que o que você está procurando é um Makefile, e possivelmente cygwin, para dar a você uma concha decente (bash, ou qualquer que seja seu sabor).

    
por 21.09.2010 / 22:11
0

Substitua as strings e as letras no texto.

Tente o loop expandindo o texto para um corpo for e substituindo var por var. Arraste e solte o arquivo de texto para que% 1 seja inserido pelo usuário, 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
)
    
por 01.05.2014 / 22:03
0

Algo como isso em um arquivo em lotes? Selecione um arquivo em uma pasta. < < é 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
    
por 28.08.2014 / 22:57
0

Confira a documentação da Microsoft no Comando batch . Você pode usar o FOR para percorrer um conjunto de diretórios, arquivos em um diretório ou arquivos em um diretório e todos os seus subdiretórios.

Por padrão, para conjuntos de alças ou apenas arquivos:

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

Ou, para recursivo:

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

ou, apenas para diretórios:

FOR /D %d DO ECHO %d
    
por 21.09.2010 / 21:07
0

este é um pequeno arquivo de depuração que fiz um pouco de tempo para testar o array do meu jogo tic tac em BATCH / CMD. ele pode ler e gravar de e para uma matriz sem ser grande e complicado no código.

usar é simples:

Escrevendo para uma matriz

  1. dê um arquivo ou modifique-o para importar outra coisa.
  2. dê um nome à matriz.
  3. e seu feito.

Lendo de uma matriz

  1. Dê o tamanho da matriz ou parte dela que você deseja ler.
  2. Coloque o nome da matriz com %% a no nome
  3. e seu 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
    
por 16.08.2016 / 14:37