Как исправить мой цикл batch for для сохранения последней строки?

#batch-file #for-loop #skip-lists

#пакетный файл #для цикла #списки пропусков

Вопрос:

У меня есть файл с именем cmd.pid, и в этом файле я сохраняю pid всех cmd.exe работает на компьютере.

Мне нужно сохранить последнюю строку файла (потому что это последний открытый cmd)

Это делается для отправки команд в окне cmd благодаря сохраненному pid.

 for /f "skip=2 delims=" %%i in ('type "mypathcmd.pid"') do set "line=%%i" amp; goto done
:done
echo line^=!line!
 

Значение 3-й строки моего файла отсутствует в !line!
Программа останавливается при ее запуске.

Это то, что хранит мой cmd.pid файл :

 16992      

12300      
 

Первая строка — 16992, 2-я строка пуста, а последняя строка — 12300.
Вы этого не видите, но после каждого pid есть пробелы (ровно 6)

Комментарии:

1. for /f "delims=" %%i in ('type "mypathcmd.pid"') do set /a "line=%%i"

2. Поможет ли использование Sort ?

3. Ваш код пропускает первые две строки, а затем возвращает содержимое следующей непустой строки, которая не начинается с ; (из-за eol опции по умолчанию); чтобы вернуть последнюю такую строку, просто удалите amp; goto done часть…

4. Сейчас я не могу получить доступ к своему коду, но этой ночью я посмотрю, работает ли он без перехода. Если это не сработало, я увижу с помощью команды сортировки. И проверьте веб-сайт Mofi. Спасибо за помощь.

5. Я нахожу, где была проблема с сбоем, это было из имени файла aa с пробелами (поэтому я переименовываю эту папку) Но есть новая проблема, когда я запускаю скрипт, он говорит Missing Operand , что это мой новый цикл for : for /f "skip=2 delims=" %%i in ('type "mypathcmd.pid"') do set /a "line=%%i"

Ответ №1:

Самым простым способом было бы удалить инструкцию

 goto done
 

и skip=? полностью удалите (хотя это не повредит.)

Таким образом, каждому значению, считанному из файла, присваивается line по очереди, поэтому самое последнее значение остается, когда for цикл завершается в конце файла.

Ответ №2:

Проблемы были:

  • В папке на моем пути был пробел => Я переименовал его, чтобы удалить пробел
  • 1-я проблема с циклом: Missing Operand => Я удалил /a of do set /a "line=%%i" , потому что я его не использую
  • 2-я проблема с циклом: ECHO is off это происходило, когда echo !line! выходило из цикла, но работало, когда оно было в цикле, поэтому я использовал a goto в конце цикла, чтобы оставить его. Теперь я могу echo !line! выйти из цикла без каких-либо проблем.
  • 3-я проблема заключалась в использовании skip=2 delims= . Я не знаю почему, но это было «неожиданно».

Это последний код цикла:

 for /f "delims= skip=1" %%i in ('type "mypathcmd.pid"') do (
    set "line=%%i"
    goto done
)
:done
echo !line!
pause
 

Этот код не добавляет «0» в конце pid, и вы можете выбрать n строк с помощью skip=n-1 .