我正在编写一个批处理脚本,它将循环遍历文本文件的每一行(每行包含文件名),检查文件是否存在,然后运行文件并将其移动.

这是我的批处理脚本:

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
)

这是输出:

我不明白为什么“if errorlevel”不能像预期的那样工作…如果该文件不存在(如本例中不存在),则不应该尝试运行该文件,它不应该复制该文件,它应该回应2不是0

编辑1:我正在读另一个SO Post关于“延迟的环境变量扩展”我不知道这个问题是否相关

@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,%%k
)
GOTO :EOF

这是一个重写的程序.

注意:output.txt在开始时被删除,否则>>将附加到任何现有文件. 2> nul如果删除失败(如文件不存在),则会抑制错误消息

在块语句(括号内的一系列语句)中,ENTIRE块被解析,然后执行.块内的任何%var%将被该变量的值替换为块被分配的时间 – 块执行前.

因此,IF(something)else(somethingelse)将在遇到IF时使用%variables%的值执行.

克服这个的两个常见方法是1)使用setlocal enabledelayedexpansion并使用!var!代替%var%来访问var的chnaged值或2)调用子例程以使用更改的值执行进一步处理.

因此,请注意使用CALL ECHO %% var %%显示更改的var值. CALL ECHO %% errorlevel %%显示,但遗憾的是RESETS错误级别.

IF DEFINED如果var为CURRENTLY定义,则var为true.

ERRORLEVEL是一个特殊的可变名称.它由系统设置,但如果由用户设置,则用户分配的值将覆盖系统值.

IF ERRORLEVEL n如果errorlevel为n或大于n,则为TRUE.因此,如果ERRORLEVEL 0始终为真.

语法SET“var = value”(其中值可能为空)用于确保行末尾的任何杂散空间不包括在分配的值中.

所需的命令仅用于ECHOed用于测试目的.验证命令正确后,将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确定返回的错误级别)

并收到结果输出:

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仅仅是ECHOed.

和output.txt

seterr1.bat,K2
seterr5.bat,K5

批处理文件 – 在Windows批处理文件中设置错误级别的更多相关文章

  1. ios – 200在xcode 7中生成DSMM警告

    解决方法我有同样的问题.Facebook表示他们已经意识到这一点并且不是高优先级,因为它不会影响应用程序.我回退到4.7.1警告问题不再存在.我不认为它会被拒绝但不能确定.

  2. xamarin.ios – Facebook iOS SDK:应用程序在启动时找不到“找不到符号:_ACFacebookAppIdKey.”仅在iOS 5中崩溃

    解决方法这是一个已修复的knownbug.目前唯一已知的解决方法是使用较旧版本的FacebookSDK.

  3. osx – 无法创建目录/ var / teamsserver

    OpenSSH_6.2p2,OSSLShim0.9.8r8Dec2011debug1:Readingconfigurationdata/etc/ssh_configdebug1:/etc/ssh_configline20:Applyingoptionsfor*debug1:Connectingto1.2.3.4[1.2.3.4]portPORT.debug1:Connectionestablished.Couldnotcreatedirectory‘/var/teamsserver/.ssh’.debug

  4. ios – 如何在Xcode 4.5中完成代码签名

    解决方法事实证明,从AppStore升级XCode并不会自动升级所有内容.转到首选项/下载,并确保安装最新的命令行工具.

  5. xcode7 – 谁在创建文件“/private/var/tmp/Untitled-*.uicatalog”?

    我正在调查为什么TeamCity构建代理程序用完了磁盘,并且在/private/var/tmp中找到了超过11,000个文件,它们都以Untitled-.uicatalog行命名.每个文件至少0.6MB.总磁盘占用空间约为4GB.这些文件可以追溯到几个月,所以他们能够重新启动.谁在创造他们?Xcode在编译至少有一个图像的xcassets目录时创建这些目录.我可以删除它们吗?

  6. ios – Client.ipa不包含文件

    从过去的几天开始,我就把这头发错了.当我尝试提交基于cordova的iOS应用程序时,我收到一个错误,即符号工具失败.这就是我在日志中的内容:以下是尝试提交到应用商店时所述错误的屏幕截图:请帮忙.解决方法我有同样的错误,因为应用程序包中错误地包含了几个静态库(libXXX.a).它们显示在主.App下的最终上传确认框(列出权利和证书)中.我的解决方案是从项目中删除对这些静态库的所有引用,在链接器标

  7. ios – 如何获得.ipa文件路径

    我的应用程序包含敏感数据,所以我想为.ipa文件生成哈希键,是否可以这样做?

  8. ios – 在设备上运行时Swift应用程序崩溃 – dyld:未加载库:@ rpath / libswiftCore.dylib

    我是ios/xcode世界的新手,并尝试在运行iOSv8.0.2的iphone5上测试一个简单的Swift应用程序.该应用程序在xcode(版本6.1(6A1052d))中成功构建,但当它尝试在iphone上运行时,它崩溃并出现以下错误:我已经尝试过大多数建议,这些建议帮助了遇到此错误的其他人,但却没有运气.使用其他团队成员的构建环境构建时,相同的应用程序工作正常.我比较了构建设置,发现它们是相同

  9. 使用Swift作为Glance后端存储

    原文链接http://thornelabs.net/2014/08/03/use-openstack-swift-as-a-backend-store-for-glance.htmlBydefault,OpenStackGlancesavesimagesandOpenStackInstancesnapshotsonthelocalfilesystemin/var/lib/glance/images

  10. 【swift】15-0530 闭包

    闭包的类型推断swift中有很强大的类型推断,所以闭包的类型可以省略。var新城市列表2=sorted->Boolin字符串1>字符串2})闭包参数简写swift提供了以开头的0,1,2,...的参数,因此就不用闭包定义参数了,直接使用开头的0,…比如:var新城市列表2=sorted可以写成:var新城市列表2=sorted{0>1}通常用于闭包表达式语句非常多的情况。

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部