O arquivo em lote não coloca strings do arquivo de texto em variáveis (código incluído)

1

O programa procura arquivos contendo determinadas palavras-chave e parte de sua tarefa é exibir as palavras-chave que estão sendo pesquisadas. As palavras-chave são escritas uma abaixo da outra em um arquivo de texto que ele lê. No entanto, só lê a partir da última linha? Provavelmente um erro muito simples, mas eu estou sentindo falta ...

@echo off
:main_section
set main_dir=%cd%
set key1=variable    
set key2=variable
set key3=variable
set key4=variable
set key5=variable
for /f "delims=" %%a in (keylist.txt) do set "key1=%%a"
for /f "skip=1 delims=" %%b in (keylist.txt) do set "key2=%%b"
for /f "skip=2 delims=" %%c in (keylist.txt) do set "key3=%%c"
for /f "skip=3 delims=" %%d in (keylist.txt) do set "key4=%%d"
for /f "skip=4 delims=" %%e in (keylist.txt) do set "key5=%%e"
echo warning: do not launch from the userprofile directory
echo warning: write exactly five keywords in keylist.txt
echo searching for %key1%, %key2%, %key3%, %key4%, %key5%
pushd collection 
>>%key1%.txt findstr /i /p /s %key1% %userprofile%\*.* >nul
echo search for %key1% complete - printed to collection\%key1%.txt
>>%key2%.txt findstr /i /p /s %key2% %userprofile%\*.* >nul
echo search for %key2% complete - printed to collection\%key2%.txt
>>%key3%.txt findstr /i /p /s %key3% %userprofile%\*.* >nul
echo search for %key3% complete - printed to collection\%key3%.txt
>>%key4%.txt findstr /i /p /s %key4% %userprofile%\*.* >nul
echo search for %key4% complete - printed to collection\%key4%.txt
>>%key5%.txt findstr /i /p /s %key5% %userprofile%\*.* >nul
echo search for %key5% complete - printed to collection\%key5%.txt
pushd %main_dir% 
for /f "tokens=3" %%f in ('dir "collection"^|find "File(s)"') do set size=%%f
set "size=%size:,=%"
echo %size% bytes of information collected
echo press any key to exit the program
pause >nul
    
por Daniel 14.10.2016 / 16:47

1 resposta

1

Provavelmente é um erro muito simples, mas sinto falta dele ...

Seus for loops estão processando todas as linhas do arquivo, então apenas o último valor no arquivo é armazenado.

Você pode simplificar seu arquivo em lote e usar um único loop for junto com a expansão atrasada e um contador

Aqui está um pequeno arquivo de lote que fornece a solução básica. Combine isso com o seu arquivo de lote.

test.cmd:

@echo off 
setlocal enabledelayedexpansion
set /a _index=1
for /f "delims=" %%a in (keylist.txt) do (
  set "key!_index!=%%a"
  set /a _index+=1
  )
echo searching for !key1!, !key2!, !key3!, !key4!, !key5!
endlocal  

Exemplo de saída:

> type keylist.txt
1
2
3
4
5
> test
searching for 1, 2, 3, 4, 5

Leitura Adicional

  • Um índice A-Z da linha de comando do Windows CMD - Uma excelente referência para todas as coisas relacionadas à linha do Windows cmd.
  • enabledelayedexpansion - Expansão com atraso fará com que as variáveis sejam expandidas em tempo de execução e não no tempo de análise.
  • para - Realize condicionalmente um comando várias vezes.
  • definir - Exibir, definir ou remover variáveis de ambiente do CMD. As alterações feitas com o SET permanecerão apenas pela duração da sessão atual do CMD.
por 14.10.2016 / 19:24