MS-DOS内置命令是否会返回错误/退出代码?

9

我还没有找到一种获取rmdir返回的错误代码的方法。似乎MS-DOS内部命令不会返回错误代码,能否有人确认一下?

如果这些命令成功或失败,脚本应该如何知道下一步该怎么做呢?最简单的方法是读取它们的返回代码(如果有的话)。

提前感谢您的帮助。


我之前在这里评论说DOS命令确实会返回错误代码,但是现在从答案和我的测试中发现,并非所有命令都是如此(我想这可能与许多“DOS命令”实际上只是调用%PATH%中的外部可执行文件有关,这些可执行文件显然可能在正确返回错误代码方面存在差异。我也不排除cmd内部命令在错误代码方面不一致的可能性;) - Alex Hall
微软又一次做了糟糕的工作。任何编写正确的工具都会给出有用的退出代码,但是微软不会...他们只是太酷了。>8^( - antred
4个回答

16
不是的,看起来并不是这样。如果你在成功或失败的rmdir之后执行echo %errorlevel%,两种情况下都会得到0
c:\pax> mkdir qqq
c:\pax> rmdir qqq
c:\pax> echo %errorlevel%
0
c:\pax> rmdir qqq
The system cannot find the file specified.
c:\pax> echo %errorlevel%
0

对于那个具体的使用情况,你最好在之后检查目录是否存在:

if exist dodgy\. rmdir dodgy
if exist dodgy\. echo dodgy directory still exists
有趣的是,如果你调用一个独立的 cmd.exe 副本来执行操作,你可以得到错误级别:
c:\pax> mkdir qqq
c:\pax> cmd /c rmdir qqq
c:\pax> echo %errorlevel%
0
c:\pax> cmd /c rmdir qqq
The system cannot find the file specified.
c:\pax> echo %errorlevel%
2

但是,我并不认为这比在删除目录后检查目录是否存在更好,因为它需要您启动一个全新的命令解释器。


3
如果 rmdir dodgy 失败,但是有一个名为 "dodgy" 的文件,那么你就有麻烦了 :) 要测试目录是否存在,请使用:if exist "dodgy\." - huysentruitw
@Wouter,好建议,已经进行了修改,尽管可能远远超出了任何约定的服务水平协议 :-) - paxdiablo
@paxdiablo,它们确实返回退出代码,只是出于某些原因未设置错误级别。但是如果您通过cmd /c方法,实际上可以获取这些代码。 - illegal-immigrant

5
md test
2>nul rmdir test&&echo ok||echo err
2>nul rmdir test&&echo ok||echo err

第一个rmdir打印正常,第二个打印错误。

rmdir是cmd.exe的内部命令,所以%errorlevel%可能没有更新。


4

rmdir 命令返回 0 表示成功或失败。这似乎很直观应该返回错误代码。然而,其他内部命令(至少是我测试过的 mkdir 和 dir 命令)确实会返回错误代码。


0

他们确实有,只是很难找到特定命令的文档,但这里有证据表明 rmdir(根据微软文档此处不会返回退出代码)实际上设置了退出代码

$process = Start-Process -FilePath "cmd" -ArgumentList "/c rmdir /q /s C:\folder\unexistingfolder" -NoNewWindow -PassThru -Wait
$process.ExitCode

如果目录不存在,输出将为2,如果存在权限问题等其他代码。


这是PowerShell脚本吗?这与DOS不同(根据问题)。 - Alex Hall
PowerShell只是用于启动cmd并读取cmd的退出代码,以证明它是由'rmdir'命令传播的。您可以使用任何其他语言来执行相同的操作,该语句仍然有效- DOS命令确实返回退出代码。 - illegal-immigrant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接