copiar array em um arquivo de lote

2

Eu tenho vários arquivos localizados em vários diretórios / subpastas que eu preciso copiar para vários destinos. Eu atualmente faço isso usando o xcopy, mas eu faço isso linha por linha, então existem várias linhas de código. Um amigo sugeriu que eu usasse uma matriz, que é o que estou tentando fazer agora.

Eu tentei várias variações para fazer isso funcionar. Minha última variação é assim:

@echo off
set "mansource=somelocation\location1\sourcefolder"
set "mandest=someloacation\location2\destfolder

set src[0]="%MANSOURCE%\folderA\number1.pdf"
set dest[0]="%MANDEST%\folderB\number"

set src[1]="%MANSOURCE%\folderC\number2.pdf"
set dest[1]="%MANDEST%\folderD\number"
set /a "x=0"

for /r "%mansource%" %%f in (!src!) do xcopy "%%f" "!dest!" /v/y 
pause

Então eu sei que isso está errado, já que não funciona, mas nada mais que eu tentei funcionou. Todos os exemplos que encontrei on-line até agora sobre o uso de matrizes em um lote têm apenas um comando "do (echo) para listar o que está sendo indexado ou imprimir uma instrução no prompt do cmd. Não consegui encontrar nenhum exemplo sobre uma função real como copiar.Eu fiz uma variação do código acima, mas apenas resultou em um loop infinito com "0 arquivos copiados" repetindo para sempre.

A idéia é ter o arquivo em src [0] copiado para os locais em dest [0], depois o arquivo em src [1] e assim por diante.

Qualquer conselho seria apreciado.

Observação: o uso de um caractere curinga * .pdf não funcionará, pois há outros PDFs nesses locais e eu só preciso de documentos específicos para serem copiados. Além disso, cada arquivo está em um local diferente do próximo e cada destino de cópia para esse arquivo também é diferente.

    
por Mike Van Dunk 25.04.2017 / 16:48

2 respostas

0

Como você está procurando uma solução em lote, outra maneira de fazer isso é criar um loop FOR com o 0 thru x intervalo do índice. O loop FOR irá iterar os valores numéricos do índice e usar o CALL para chamar nomes de sub-rotina correlacionados.

Os nomes dos rótulos da sub-rotina serão os mesmos, exceto os valores numéricos do índice (como no loop FOR ) são anexados aos nomes dos rótulos (ou seja, :idx0 , :idx1 , :idx2 e assim por diante).

Cada sub-rotina deve ter os nomes de variáveis "iguais", mas os valores de cada um devem ser definidos de acordo com a necessidade, mas cada sub-rotina deve terminar com GOTO :EOF . O GOTO :EOF passará o controle de volta para o responsável pela chamada e permitirá que ele conclua sua lógica. Nesse caso, o FOR / R loop será iniciado.

Certifique-se de que, uma vez que sua lógica termine, você terá EXIT ou GOTO :EOF para que ela não seja movida para a lógica abaixo, como rótulos de sub-rotinas destinados apenas a serem executados com CALL .

Exemplo de script

@echo off

set "mansource=somelocation\location1\sourcefolder"
set "mandest=someloacation\location2\destfolder"

FOR %%A IN (0,1) DO CALL :idx%%A
for /r "%mansource%" %%f in (!src!) do xcopy "%%f" "!dest!" /v/y 
pause
::GOTO :EOF
EXIT

:idx0
set src="%MANSOURCE%\folderA\number1.pdf"
set dest="%MANDEST%\folderB\number"
GOTO :EOF

:idx1
set src="%MANSOURCE%\folderC\number2.pdf"
set dest="%MANDEST%\folderD\number"
GOTO :EOF

Mais recursos

por 11.05.2017 / 07:01
0

Lote + "arrays" (que na verdade não são arrays) são uma dor. :)

Sugiro usar o PowerShell, pois ele suporta matrizes adequadas. Algo como:

$mansource = "somelocation\location1\sourcefolder"
$mandest = "someloacation\location2\destfolder"

# Create empty arrays
$sources = @()
$destinations = @()

# Add values to arrays
$sources += Join-Path $mansource "\folderA\number1.pdf"
$sources += Join-Path $mansource "\folderC\number2.pdf"

$destinations += Join-Path $mandest "\folderB\number"
$destinations += Join-Path $mandest "\folderD\number"

# Iterate over the Sources array and copy to the matching Destination.
for ($i = 0; $i -le $sources.length; $i++) {
    Copy-Item $sources[$i] $destinations[$i] -Force
}
    
por 25.04.2017 / 17:50