Eu tenho 2 arquivos, 1 contendo determinadas palavras-chave e outro contendo uma lista de caminhos. Quero pesquisar as palavras-chave da primeira lista de arquivos na lista de caminhos de arquivos e, se encontradas, copiar os arquivos do caminho de arquivo especificado para uma pasta de destino específica.
Conteúdo do primeiro arquivo
Keyword1
Keyword2
Keyword3
Keyword4
Conteúdo do segundo arquivo
\\server\path...\Keyword1.txt
\\server\path...\Keyword1_0_1.txt
\\server\path...\Keyword2_0_1.txt
\\server\path...\Keyword2_1_9.txt
\\server\path...\Keyword3_1_0_1.txt
Eu tenho que escrever o script em lote do Windows para essa finalidade.
================================================= ==========
Desculpe @pimp-juice-it, não sei como colar a captura de tela. Portanto, copie e cole a saída abaixo -
d:\Temp_Script\Script>FOR /R "D:\Temp_Script\Source\33.txt" %G IN (55*) DO ECHO "55" d:\Temp_Script\Script>CALL :FileExist "55" "D: \Temp_Script\Source\44.txt" d:\Temp_Script\Script>FOR /R "D:\Temp_Script\Source\44.txt" %G IN (55*) DO ECHO "55" d:\Temp_Script\Script> CALL :FileExist "55" "D:\Temp_Script\Source\55.txt" d:\Temp_Script\Script>FOR /R "D:\Temp_Script\Source\55.txt" %G IN (55*) DO ECHO " 55" d:\Temp_Script\Script>CALL :FileExist "55" "D:\Temp_Script\Source\55 - Copiar (2).txt" d:\Temp_Script\Script>FOR /R "D:\Temp_Script\Source\ 55 - Copiar (2).txt" %G IN (55*) DO ECHO "55" d:\Temp_Script\Script>CALL :FileExist "55" "D:\Temp_Script\Source\55 - Copy.txt"
como você pode ver, a palavra-chave "55" existe no UNC, mas ainda assim a condição não está sendo validada como True no loop FOR e vai para o próximo UNC diretamente. Abaixo está o código -
:FileExist FOR /R "%~2" %%G IN (%~1*) DO ECHO "%~1"
Responder1
Você pode percorrer a lista de "palavras-chave" uma vez e usar os valores de palavras-chave iterados junto com alguns caracteres curinga incluídos como strings de pesquisaou seja *<Keyword>*
. Você pode percorrer a árvore de diretórios de cada valor de caminho UNC de sua lista de arquivos e executar a operação de cópia apenas para aqueles que correspondem à string de pesquisa "palavras-chave".
Essencialmente, porém...
- O primeiropara /floop lerá cada linha da lista de arquivos de string, uma por uma, e o valor de cada linha será um valor iterado que é passado no primeiro argumento para o chamarcomando.
- O segundopara /floop irá ler cada linha da lista de arquivos do caminho UNC, uma por uma, e passá-la junto com o valor do primeiro argumento passado pelo primeiropara /floop como dois argumentos com seu chamarcomando.
- O últimopara /rloop pesquisará recursivamente o caminho UNC iterado com o valor da string iterada como argumentos separados que foi passado e, em seguida, copiará todos os arquivos correspondentes.
Script em lote
@ECHO ON
SET "strList=\\server\Folder\Path\SearchStrings.txt"
SET "pathList=\\server\Folder\Path\UNCPaths.txt"
SET "targetPath=\\server\target\folder\path"
FOR /F "USEBACKQ TOKENS=*" %%S IN ("%strList%") DO CALL :Paths "%%~S"
PAUSE
EXIT
:Paths
FOR /F "USEBACKQ TOKENS=*" %%P IN ("%pathList%") DO CALL :FileExist "%~1" "%%~P"
GOTO :EOF
:FileExist
FOR /R "%~2" %%C IN (*%~1*) DO XCOPY /F /Y "%%~C" "%targetPath%\"
GOTO :EOF
Recursos adicionais
-
O comando CALL passará o controle para a instrução após o rótulo especificado junto com quaisquer parâmetros especificados. Para sair da sub-rotina, especifique
GOTO:eof
que isso transferirá o controle para o final da sub-rotina atual. -
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] Walks the directory tree rooted at [drive:]path, executing the FOR statement in each directory of the tree. If no directory specification is specified after /R then the current directory is assumed. If set is just a single period (.) character then it will just enumerate the directory tree.