Arquivo de lote do Windows, percorrendo arquivos na pasta para criar uma lista de parâmetros para passar para outro script

1

Eu tenho um arquivo em lotes do Windows que processa um monte de arquivos. Como parte disso, uso a seguinte linha:

forfiles /p "%~dpn1%LogDir%" /m "%SupportLog%*" /c "cmd /c logreader.py @file > \"%~dpn1%ParsedLogDir%\@file_Logreader.txt\"

Isso funciona bem, mas essencialmente percorre todos os meus arquivos (% SupportLog% *) e passa cada um deles para o script "logreader.py".

O que eu realmente quero fazer é criar uma lista ou parâmetro de todos esses arquivos e passar todos eles de uma só vez para o script Python, de modo que o comando que deve ser executado se pareça com:

logreader.py "logfile.log" "logfile.log.1" "logfile.log.3" .....

Eu tentei usar o comando SET dentro do comando forfile de forma que:

forfiles /p "%~dpn1%LogDir%" /m "%SupportLog%*" /c "cmd /c set PARAMS=%PARAMS%@file "

No entanto, quando executar isso e deixar o ECHO, vejo:

forfiles /p "C:\Path\log" /m "logfile.log*" /c "cmd /c set PARAMS=@file "

Qual é incorreto E quando eu "ecoa% PARAMS%", não obtenho resultado.

Existe uma maneira de conseguir isso?

Muito obrigado

Swinster
fonte

Respostas:

1

Alterar as variáveis ​​de ambiente em uma instância filha cmd (isso é o que cmd /cchama) não afeta o ambiente no cmdprocesso pai . O próximo trecho de código poderia ajudar:

SETLOCAL EnableExtensions EnableDelayedExpansion
set "LogDir=%~dpn1log"         my guess only
set "SupportLog=logfile.log"   my guess only
set "PARAMS="                  initial value
rem 1st try for /R "%LogDir%" %%a in ("%SupportLog%*") do set PARAMS=!PARAMS! "%%~a"
rem 2nd try for %%a in ("%LogDir%\%SupportLog%*") do set "PARAMS=!PARAMS! "%%~a""
rem 3rd try
for %%a in ("%LogDir%\%SupportLog%*") do set "PARAMS=!PARAMS! "%%~nxa""
echo logreader.py %PARAMS%

Observe que o imperativo logreader.pyé meramente echoeditado para fins de depuração.

No entanto, eu não apreendo alvo de >redirecionamento, desculpe ...

Recursos (leitura obrigatória):

Editar :

JosefZ
fonte
Oi José, isso é quase perfeito, embora o for /rparece recurse a árvore de pastas. Agora, tudo bem, na primeira vez que executo esse arquivo em lote, como posso definir o Forloop no início do lote que avalia a pasta antes de criar uma subpasta para armazenar o arquivo analisado, mas se eu executar o lote novamente, se escolher arquivo na subpasta. (desculpe pelos múltiplos comentários, eu não consegui pegar o jeito deles; ()
Swinster
Doh Menino idiota! Basta remover o /re definir o SETpara o diretório correto. Muito obrigado, tudo feito, pelo que eu posso ver. Talvez eu deva começar a procurar no PowerShell para construir essas coisas no futuro.
Swinster
1
Para referência, a linha completa que funcionou foi For %%A in ("%~dpn1%LogDir%\%SupportLog%*") do ( set PARAMS=!PARAMS! "%%A" ). Isso é usado em conjunto com a passagem de um arquivo para o arquivo de lote em primeiro lugar (através de um atalho SentTo)
Swinster