批处理文件和 DEL errorlevel 0 问题

2024-01-08

该批处理必须从特定位置删除文件和目录,并将成功或 stdout/stderr 消息输出到新的 .txt 文件。我已经创建了脚本的大部分内容,并且它的执行完全符合预期,除非删除成功,否则它会前进到下一行,而不是在日志上回显“成功”消息。

echo Basic Deletion Batch Script > results.txt
@echo off
call :filelog >> results.txt 2>&1
notepad results.txt
exit /b

:filelog

call :delete new.txt
call :delete newer.txt
call :delete newest.txt
call :remove c:\NoSuchDirectory

GOTO :EOF

:delete
echo deleting %1
del /f /q c:\Users\newuser\Desktop\%1 
if errorlevel 0 echo succesful

GOTO :EOF

:remove
echo deleting directory %1
rmdir /q /s %1

GOTO :EOF

由于某种原因,我找不到 if del successes echo 'successful' 的语法。在上面的示例中,如果我删除该行

if errorlevel 0 echo successful

一切正常,但没有成功消息。留下这句话就呼应了每一行的成功。


del and ErrorLevel?

The del命令不设置ErrorLevel只要给定的参数有效,它甚至会重置ErrorLevel to 0在这种情况下(至少对于 Windows 7)。

del修改ErrorLevel仅在提供无效开关的情况下(del /X sets ErrorLevel to 1),根本没有指定任何参数(del sets ErrorLevel to 1太),或者给出了不正确的文件路径(del : sets ErrorLevel to 123),至少对于 Windows 7 而言。

可能的解决方法

一个可能的解决方法是捕获STDERR的输出del,因为如果发生删除错误,相关消息(Could Not Find [...], Access is denied., The process cannot access the file because it is being used by another process.)写在那里。这样可能看起来像:

for /F "tokens=*" %%# in ('del /F /Q "\path\to\the\file_s.txt" 2^>^&1 1^> nul') do (2> nul set =)

要直接在命令提示符中使用代码而不是在批处理文件中,请编写%#代替%%#.

如果您不想删除只读文件,请删除/F来自del命令行;
如果您确实需要提示(以防通配符? and/or *存在于文件路径中),删除/Q.

代码解释

这会执行命令行del /F /Q "\path\to\the\file_s.txt"。按部分2>&1 1> nul,命令输出在STDOUT将被解雇,其STDERR输出将被重定向,以便for /F收到它。

如果删除成功的话del不生成STDERR输出,因此for /F循环不会迭代,因为没有什么可解析的。请注意ErrorLevel在这种情况下不会被重置,其值保持不变。

If for /F收到任何STDERR输出从del命令行,执行循环体内的命令,即set =;这是无效的语法,因此set设置ErrorLevel to 1. The 2> nul部分避免了消息The syntax of the command is incorrect.要显示。

要设置ErrorLevel明确地你也可以使用cmd /C exit /B 1。也许这条线更清晰。当然它更灵活,因为您可以指定任何(带符号的 32 位)数字,包括0清除它(省略数字也会清除它)。但在性能方面可能会差一些。

应用实例

以下批处理文件演示了如何应用上述解决方法:

:DELETE
echo Deleting "%~1"...
rem this line resets ErrorLevel initially:
cmd /C exit /B
rem this line constitutes the work-around:
for /F "tokens=*" %%# in ('del /F /Q "C:\Users\newuser\Desktop\%~1" 2^>^&1 1^> nul') do (2> nul set =)
rem this is the corrected ErrorLevel query:
if not ErrorLevel 1 echo Deleted "%~1" succesfully.
goto :EOF

预设ErrorLevel

除了上面提到的命令之外cmd /C exit /B,您还可以使用> nul ver重置ErrorLevel。这可以与for /F像这样循环解决方法:

> nul ver & for /F "tokens=*" %%# in ('del /F /Q "\path\to\the\file_s.txt" 2^>^&1 1^> nul') do (2> nul set =)

替代方法没有for /F

而不是使用for /F捕捉STDERR的输出del, the find命令也可以像这样使用find /V "",它返回一个ErrorLevel of 1如果输入一个空字符串并且0否则:

del "\path\to\the\file_s.ext" 2>&1 1> nul | find /V "" 1> nul 2>&1

但是,这将返回一个ErrorLevel of 1如果删除成功并且0如果不。为了扭转这种行为,if/else子句可以像这样附加:

del "\path\to\the\file_s.ext" 2>&1 1> nul | find /V "" 1> nul 2>&1 & if ErrorLevel 1 (1> nul ver) else (2> nul set =)

不同的方法:检查文件是否存在del

一种完全不同的方法是在尝试删除文件后检查文件是否存在(感谢用户Sasha https://stackoverflow.com/users/1421194为了hint https://stackoverflow.com/questions/22953027/batch-file-and-del-errorlevel-0-issue/33403497#comment100505753_33403497!),像这样,例如:

del /F /Q "\path\to\the\file_s.txt" 1> nul 2>&1
if exist "\path\to\the\file_s.txt" (2> nul set =) else (1> nul ver)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

批处理文件和 DEL errorlevel 0 问题 的相关文章

随机推荐

  • 自动更新.NET应用程序[重复]

    这个问题在这里已经有答案了 我们正在开发一个非常复杂的系统 该系统由多个 WCF 服务 ASP NET MVC 应用程序 管理工具 Windows 窗体应用程序 组成 其中一些将在多个服务器上运行实例 我们正在为这样的系统寻找一个好的自动更
  • 程序崩溃以及编码中算术运算的一些问题

    stackoverflow 社区大家好 我的代码有一些问题 我目前是一名学生 所以基本上我是一个初学者 使用欧几里得算法 下面显示的代码应该将两个数字相除 直到商达到 0 但它只是在商变为 0 之前的最后一个除法过程中停止 我不知道程序是否
  • 设置应用程序的supervisor环境变量

    我正在从supervisord 运行一个应用程序 我必须为其设置一个环境 大约有30个环境变量需要设置 我尝试过把一切都放在一件大事上 环境 线 这似乎不起作用 我还尝试了多个environment 行 但这似乎也不起作用 我还尝试了在 e
  • 递增数组值 - Arduino

    我正在尝试增加一些数组值 int counter 0 0 0 0 0 0 0 0 如果位置 0 的数字值达到 25 则位置 1 的值加 1 位置 0 重置为 0 依此类推 当索引位置 2 达到 25 时 位置 3 增加 1 并重置它的值 自
  • 在 if 语句中使用函数的返回值

    希望这里有一个简短的问题 可以在 if 语句中使用函数的返回值吗 IE function queryThis request return false if queryThis foo false doThat 我确信非常简单明了 但我遇到
  • 安装错误:INSTALL_FAILED_INSUFFICIENT_STORAGE?运行模拟器期间

    2011 07 22 16 33 02 Today 2011 07 22 16 33 02 Today Android Launch 2011 07 22 16 33 02 Today adb is running normally 201
  • 如何在 Ruby 中正确使用保护子句

    在此示例中使用保护子句的正确方法是什么 def require admin unless current user current user role admin flash error You are not an admin redir
  • Java 将 19 位 Unix 时间戳转换为可读日期

    我正在尝试转换 19 位 Unix 时间戳 例如1558439504711000000 1个半五亿 https en wikipedia org wiki Names of large numbers 转换为可读的日期 时间格式 我的时间戳
  • SqlAlchemy 与 Marshmallow 的关系

    我正在尝试返回 JSON 甚至返回一对多 sqlalchemy 查询的完整字符串 我此时正在使用 Marshmallow 来尝试执行此操作 但它不断返回不完整的数据 我有两个模型定义为 class UserModel db Model ta
  • 将 onclick 添加到子菜单?

    我的菜单有一个 onclick 函数 但我无法弄清楚子菜单的 ID 是什么 以便我可以告诉子菜单当用户单击它时要做什么 我使用下面的代码以编程方式创建了子菜单 因此 如果有人可以向我解释一下我如何知道子菜单中每个项目的 id 是什么 我将不
  • 在 Rails 3 中为 OmniAuth 创建命名路由

    观看 Ryan 精彩的 Railcast 后简单的 OmniAuth http railscasts com episodes 241 simple omniauth 我已经设法在我的应用程序中实现身份验证 一切工作正常 但在我看来 我的链
  • 如何以编程方式关闭 UITextView 中的自动更正弹出窗口?

    我正在自己做一些自定义自动完成的事情insertText 但是如果有可见的自动更正建议 视图就会进入奇怪的状态 如果我使用 textView unmarkText 它会忽略自动更正弹出窗口 但它接受自动更正 这很糟糕 有什么方法可以以编程方
  • 最佳 JDBC 数据源 bean 类

    我看到有些人使用org apache commons dbcp BasicDataSource而其他配置有com mchange v2 c3p0 ComboPooledDataSource Spring有它自己的 org springfra
  • 使用字典中的值替换列中的值

    import pandas as pd df pd DataFrame Data Hey this is 123456 Jonny B Good This is Jonny B Good at 511 233 1137 Wow that i
  • Google Play 服务已过时。需要 7571000 但找到 6774470

    我正在尝试将 google play API 添加到我的 Android 游戏中 并且按照他们网站上的说明进行操作 我在模拟器运行时遇到这个错误 试图解决它 在我的手机上 应用程序崩溃了 在清单中
  • 为什么我的异步函数返回空数组?

    我试图通过将用户的匹配项推入一个数组并返回该数组来获取用户的匹配项 以便我的路由器可以将数据发送到前端 但我的异步函数有一个问题 我只有一个空数组 我尝试设置一些断点 我注意到我的路由器在我的服务将数据推送到数组之前发送数据 这是我的路由器
  • Django 1.4 在开发服务器上提供 MEDIA_URL 和 STATIC_URL 文件

    刚刚升级到 Django 1 4 并且在开发服务器上新的 改进 的静态和媒体文件服务方面遇到了严重问题 我喜欢 Django 但到底为什么他们用 STATIC URL STATIC ROOT STATICFILES DIR 使这些文件的服务
  • 使用命令行从谷歌下载图像[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想用命令行下载谷歌给我的第n张图像 即像使用命令一样wget 搜索图像 something 我只是去页面https www google
  • const 中 u32::BITS 的替代方案是什么?

    我有一些代码可以做到这一点 const MY CRAZY CONSTANT u32 1 lt lt u32 BITS 1 我尝试使用 Rust nightly 2016 03 29 编译它 但失败并显示以下消息 error no assoc
  • 批处理文件和 DEL errorlevel 0 问题

    该批处理必须从特定位置删除文件和目录 并将成功或 stdout stderr 消息输出到新的 txt 文件 我已经创建了脚本的大部分内容 并且它的执行完全符合预期 除非删除成功 否则它会前进到下一行 而不是在日志上回显 成功 消息 echo