Пакет Windows для обработки файлов для строк - PullRequest
1 голос
/ 09 августа 2011

У меня есть следующий код, чтобы определить, есть ли в файле строка во второй строке (:: echo1, :: echo2 и :: echo3). Однако, когда я по какой-то причине запускаю свой код в подпрограмме: _verify в команде IF внутри команды FOR, он полностью пропускает остальную часть IF, которая увеличивает переменную% chk% и возвращает к: _verify, что, в свою очередь, увеличивает число of :: echo, который он ищет в файле и снова ищет тот же файл (ему нужно искать каждый файл для всех 3). Я попытался изменить команду IF на IF NOT и переключить остальные, чтобы они были впереди, и вызов: _redeem last, но произошла та же ошибка. (Примечание: он завершил вызов: _verify правильно для файла, содержащего :: echo1). Он проверяет каждый файл на наличие: :: echo1, потому что он не увеличивает% chk%, и снова переходит к: _verify. Вместо этого он переходит непосредственно к goto: eof и возвращается к: identifier, чтобы найти другой файл, который он будет снова обрабатывать, только для :: echo1. Я добавил комментарии, чтобы помочь объяснить мой сценарий.

set gt1=1
setLocal EnableDelayedExpansion
::Identifies all files meeting the criteria (name being tmp*.tmp) and sets cap%gt1% equal the filename. Also checks to see if there are no files left (if the filename doesn't exist (i.e. it's blank because there are none left)).
:identify
set chk=1
if %gt1%==4 goto :restore
for %%A in (tmp*.tmp) do (set cap%gt1%=%%A) & call :_verify 
if not exist !cap%gt1%! goto :error
goto :identify

:_verify
::Verifies that the specific file it's looking at (set as cap%gt1% in :identify) has the string ::echo1, 2 or 3 as the second line.
if %chk%==4 call :_reserve & goto :eof
for /f "skip=1" %%B in (!cap%gt1%!) do if %%B==::echo%chk% (call :_redeem) else (set /a chk=%chk%+1) & (goto :_verify)
goto :eof

:_redeem
::Renames files that are confirmed to have the string to their string name (minus the ::).
ren !cap%gt1%! echo%chk%.tmp
set /a gt1=%gt1%+1
goto :eof

:_reserve
::Subroutine used to temporairly discard files that do not meet the requirements so they will not be processed again in :identify during loopback.
if not exist temp50 mkdir temp50
move !cap%gt1%! temp50
goto :eof

:restore
::Restores files that were put in :_reserve to their previous location.
if exist %~dp0\temp50 cd temp50 & for %%C in (tmp*.tmp) do move %%C %~dp0 & cd .. & rmdir temp50
pause

:error
::Error in case it can't find all three files containing the strings.
echo Unable to find program files. Please reinstall.
echo.
pause
quit

1 Ответ

1 голос
/ 09 августа 2011

Вместо этого он переходит непосредственно к goto: eof

Это тот случай, когда вы пишете код для этого.
Вы хотите написать

if %chk%==4 (call :_reserve & goto :eof)

Но ваш код работает как

if %chk%==4 call :_reserve
goto :eof

Вам следует избегать использования разделителя &, лучше использовать несколько строк с круглыми скобками.

for %%A in (tmp*.tmp) do (
   set cap%gt1%=%%A
   call :_verify 
)
....
if %chk%==4 (
   call :_reserve
   goto :eof
)
...