Иногда я думаю, что мои отношения с командной строкой Windows взвешены в пользу синдрома Стокгольма, а не муравья. Я надеюсь, что у кого-то еще в этом мире наказаний есть ответ для меня!
Вот предыстория и формулировка проблемы: у меня есть довольно большой скрипт, который работает с for для l oop, который проходит по файлу, ищет номер записи и изменяет запись во время записи записей вокруг хорошим последовательным пакетным способом ie записей записываются в целевую запись; измененная запись записывается; остальные записи написаны. Мне нужно было добавить новый глагол действия к существующему набору, который требует дополнительного предложения IF
. Он внезапно перестал записывать оставшиеся записи после того, как найденная запись была изменена. Не удалось найти ответ.
Поэтому я начал убирать код, пока не достиг этого остаточного сценария. Предложение IF
в FOR/ in / DO
l oop ... Оставьте это, сценарий останавливается после записи, как показано в первом примере ниже; оставьте это, FOR
l oop с удовольствием справится со своей задачей, согласно второму примеру вывода. Это становится незнакомым. Добавление в скрипт дает сообщения об ошибках, иногда до конца, иногда даже не простое эхо выдаст ошибку синтаксического анализа. Размещение в сценарии также имеет значение, что делает отладку абсолютным кошмаром.
Очевидно, что что-то заставляет процессор команд выйти из l oop. Поэтому я бы поставил перед сообществом следующие два вопроса:
Что заставляет структуру FOR /in /DO
прекратить обработку записей
Что дает с заявлениями эха, дающими ошибки разбора? (отображение имени переменной с номером строки скрипта или, например, только с номером, очень мало влияет.)
Спасибо. Далее следует код, любой текстовый файл можно использовать в качестве второго параметра, первый - номер строки для действия.
echo off
SETLOCAL enabledelayedexpansion
SET _filein=%~2
SET _line=%1
set _cnt=0
:: _filein = any file, _line = the line to be inspected, _cnt = loop counter
:: in the loop: _record = line value, _msg= display message if line is found
FOR /f "tokens=1 delims=" %%i IN ('type %_filein%') DO (
SET _record=%%i
SET /a _cnt+=1
IF [!_cnt!]==[%_line%] (
echo the line %_line% is !_record!
set _msg=the line is !_record! at position !_cnt!
goto sayrecord
)
echo not the line:
:sayrecord
echo !_cnt!- !_record!
)
:Xit
echo:
IF [%_msg%]==[] (
echo: left out
) ELSE (
echo: I'm in to see %_msg%
)
ENDLOCAL
exit /b
Тестовые прогоны:
1. С оператором IF: (примечание об ошибке синтаксического анализа)
H> _a 3 _files.txt
H>echo off
not the line:
1- notes.bat
not the line:
2- notesqa.bat
the line 3 is bulkfiledelete.bat
3- bulkfiledelete.bat
line was unexpected at this time.
H>
Без IF:
H> _a 3 _files.txt
H>echo off
not the line:
1- notes.bat
not the line:
2- notesqa.bat
not the line:
3- bulkfiledelete.bat
not the line:
4- CheckAdminRights.bat
not the line:
: : :
not the line:
47- Reset connection 3 - renew.lnk
not the line:
48- ============
left out
H>