我正在编写一个批处理脚本,它将循环遍历文本文件的每一行(每行包含一个文件名),检查文件是否存在,然后运行该文件并移动它.
这是我的批处理脚本:
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 not exist .\ready\%%i set errorlevel=2
echo return code is %errorlevel%
ECHO Run %%i if it exists
if errorlevel 0 call .\ready\%%i
ECHO Move %%i to archive if no error occured
if errorlevel 0 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 %errorlevel% NEQ 0 >>output.txt %%i, %%j, %%k
)
Run Code Online (Sandbox Code Playgroud)
这是输出:

我不明白为什么"if errorlevel"没有按预期工作...如果文件不存在(如本例所示,它不存在)它不应该尝试运行该文件,它不应该复制文件,它应该回显2而不是0
jww*_*jww 26
ERRORLEVEL并且%ERRORLEVEL%是两个不同的变量.这意味着你的代码echo return code is %errorlevel%,并if %errorlevel% NEQ 0 >>output.txt %%i, %%j, %%k可能是错误的.
ERRORLEVEL内置并用于获取最后一个命令的结果.您可以像以下一样使用它:
IF ERRORLEVEL 1 ECHO error level is 1 or more
Run Code Online (Sandbox Code Playgroud)
ERRORLEVEL 不能设置,就像bash不会让你set ?= ...
%ERRORLEVEL%是一个环境变量.如果%ERRORLEVEL%已设置,则在您使用时在脚本中使用它%ERRORLEVEL%.如果%ERRORLEVEL%未设置及 如果启用了命令扩展,然后回落到ERRORLEVEL.ERRORLEVEL并没有更新%ERRORLEVEL%.
Raymond Chen有一篇很好的博客文章:ERRORLEVEL is not %ERRORLEVEL%.这个答案中的一些内容被无耻地从中解脱出来.
Mag*_*goo 11
@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
Run Code Online (Sandbox Code Playgroud)
这是一个重写的程序.
注意:output.txt在开始时删除,否则>>将附加到任何现有文件.2>nul如果删除失败(例如,文件不存在),则禁止显示错误消息
在块语句中(a parenthesised series of statements),解析ENTIRE块并执行THEN.任何%var%块内将由该变量的值来替代在当时的块进行解析, -执行块之前.
因此,IF (something) else (somethingelse)将使用遇到%variables%时的值来执行IF.
克服这种情况的两种常用方法是1)使用setlocal enabledelayedexpansion和使用!var!来代替%var%访问chnaged值var或2)调用子程序以使用更改的值执行进一步处理.
因此请注意其使用CALL ECHO %%var%%显示更改后的值var.CALL ECHO %%errorlevel%%显示,但遗憾的是RESETS错误级别.
IF DEFINED var如果var是CURRENTLY定义,则为true .
ERRORLEVEL是一个特殊的可变名称.它由系统设置,但如果由用户设置,则用户指定的值将覆盖系统值.
IF ERRORLEVEL n如果errorlevel是n 或大于n,则为TRUE .IF ERRORLEVEL 0因此总是如此.
语法SET "var=value"(其中value可以为空)用于确保行末尾的任何杂散空间不包含在指定的值中.
所需命令仅ECHO用于测试目的.您确认后,该命令是正确的,变化的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
Run Code Online (Sandbox Code Playgroud)
使用seterr*.bat包含的现有文件
@ECHO OFF
EXIT /b 1
Run Code Online (Sandbox Code Playgroud)
(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
Run Code Online (Sandbox Code Playgroud)
请注意,COPY仅仅ECHO是我之前提到过的.
和output.txt
seterr1.bat, J1, K1
seterr5.bat, J2, K2
seterr5.bat, J4, K4
notexist.bat, J5, K5
Run Code Online (Sandbox Code Playgroud)