Пакетный файл не помещает строки из текстового файла в переменные (включая код)

1

Программа ищет файлы, содержащие определенные ключевые слова, и частью ее задачи является отображение искомых ключевых слов. Ключевые слова пишутся одно под другим в текстовом файле, из которого они читают. Тем не менее, он читает только с последней строки? Вероятно, очень простая ошибка, но я скучаю по ней ...

@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
Даниил
источник
Удалите ( rem) @echo offи запустите ваш командный файл. Вы увидите свою ошибку. Подсказка: первый forцикл обрабатывает все строки в keylist.txt. Следующий forцикл обрабатывает последние четыре строки ...
DavidPostill
Я редко использую for / f для чтения строк, поэтому я думаю, что skip = 3 означает пропустить первые три строки и прочитать четвертую вместо всего, что ниже 3. Есть ли способ помешать этому?
Даниил

Ответы:

1

Вероятно, очень простая ошибка, но я скучаю по ней ...

Ваши forциклы обрабатывают все строки в файле, поэтому сохраняется только последнее значение в файле.

Вы можете упростить ваш пакетный файл и использовать один forцикл вместе с отложенным расширением и счетчиком.

Вот небольшой пакетный файл, который дает вам основное решение. Объедините это с вашим командным файлом.

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  

Пример вывода:

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

Дальнейшее чтение

  • Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
  • enabledelayedexpansion - отложенное расширение приведет к тому, что переменные будут расширяться во время выполнения, а не во время разбора.
  • for - Условно выполнить команду несколько раз.
  • set - отображать, устанавливать или удалять переменные окружения CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
ДэвидПостилл
источник