Ответ 1
@ECHO OFF
SETLOCAL
DEL output.txt 2>nul
REM Loop through each line of input.txt
FOR /F "tokens=1-3 delims=, " %%i IN (.\ready\input.txt) DO (
ECHO.
ECHO.
ECHO.
ECHO Check %%i exists, set error flag if it doesnt
if exist .\ready\%%i (set "errorflag=") ELSE (set errorflag=2)
CALL echo return code is %%errorflag%%
ECHO Run %%i if it exists
if NOT DEFINED errorflag (
call .\ready\%%i
ECHO Move %%i to archive if no error occured
if errorlevel 1 (SET errorflag=3) ELSE (ECHO copy .\ready\%%i .\archive\%mydate%_%mytime%_%%j_%%k_%%i)
)
ECHO Copy line of text to the new output.txt file if an error occured
if DEFINED errorflag >>output.txt ECHO %%i, %%j, %%k
)
GOTO :EOF
Здесь перезаписана процедура.
Примечание: output.txt
удаляется в начале, иначе >>
будет добавляться в любой существующий файл. 2>nul
подавляет сообщения об ошибках, если сбой удаления (например, файл не существует)
В блочном выражении (a parenthesised series of statements)
выполняется анализ блока ENTIRE и выполняется THEN. Любой %var%
внутри блока будет заменен на это значение переменной В ВРЕМЯ БЛОК ПРОВЕРЕН - до того, как будет выполнен блок.
Следовательно, IF (something) else (somethingelse)
будет выполняться с использованием значений %variables%
во время встречи IF
.
Два общих способа преодоления: 1) использовать setlocal enabledelayedexpansion
и использовать !var!
вместо %var%
для доступа к полученному значению var
или 2) для вызова подпрограммы для дальнейшей обработки с использованием измененные значения.
Обратите внимание, что использование CALL ECHO %%var%%
, которое отображает измененное значение var
. CALL ECHO %%errorlevel%%
отображает, но, к сожалению, RESETS errorlevel.
IF DEFINED var
истинно, если var
имеет значение СОВЕТ.
ERRORLEVEL
- это специальное имя переменной. Он задается системой, но если он задан пользователем, назначенное пользователем значение переопределяет системное значение.
IF ERRORLEVEL n
ИСТИНА, если ERRORLEVEL
n ИЛИ БОЛЬШЕ, чем n. IF ERRORLEVEL 0
всегда верно.
Синтаксис SET "var=value"
(где значение может быть пустым) используется для обеспечения того, чтобы любые свободные пробелы в конце строки НЕ включались в назначенное значение.
Для целей тестирования требуемые команды просто ECHO
ed. После того, как вы подтвердите правильность команд, измените ECHO COPY
на COPY
, чтобы фактически скопировать файлы.
Я использовал следующий input.txt
:
seterr1.bat, J1, K1
seterr5.bat,J2,K2
seterr0.bat,J3 K3
seterr5.bat, J4, K4
notexist.bat, J5, K5
С существующими файлами seterr*.bat
, которые содержат
@ECHO OFF
EXIT /b 1
(где 1
в последней строке определяет возвращаемый ERRORLEVEL
)
и получил результат:
Check seterr1.bat exists, set error flag if it doesnt
return code is
Run seterr1.bat if it exists
Move seterr1.bat to archive if no error occured
Copy line of text to the new output.txt file if an error occured
Check seterr5.bat exists, set error flag if it doesnt
return code is
Run seterr5.bat if it exists
Move seterr5.bat to archive if no error occured
Copy line of text to the new output.txt file if an error occured
Check seterr0.bat exists, set error flag if it doesnt
return code is
Run seterr0.bat if it exists
Move seterr0.bat to archive if no error occured
copy .\ready\seterr0.bat .\archive\__J3_K3_seterr0.bat
Copy line of text to the new output.txt file if an error occured
Check seterr5.bat exists, set error flag if it doesnt
return code is
Run seterr5.bat if it exists
Move seterr5.bat to archive if no error occured
Copy line of text to the new output.txt file if an error occured
Check notexist.bat exists, set error flag if it doesnt
return code is 2
Run notexist.bat if it exists
Copy line of text to the new output.txt file if an error occured
Обратите внимание, что COPY просто ECHO
ed, как я упоминал ранее.
и output.txt
seterr1.bat, J1, K1
seterr5.bat, J2, K2
seterr5.bat, J4, K4
notexist.bat, J5, K5