Batch file MS-DOS内置命令是否返回错误\退出代码?

Batch file MS-DOS内置命令是否返回错误\退出代码?,batch-file,dos,windows-scripting,Batch File,Dos,Windows Scripting,我还没有找到一种方法来获取rmdir的错误代码(如果返回的话)。MS-DOS内部命令似乎不返回错误代码。有人能证实吗 使用这些命令的脚本如何知道这些命令是否成功以决定下一步?最简单的方法是读取返回代码(如果返回) 提前谢谢。不,似乎没有。如果在成功或失败的rmdir之后echo%errorlevel%,在这两种情况下都会得到0: c:\pax> mkdir qqq c:\pax> rmdir qqq c:\pax> echo %errorlevel% 0 c:\pax>

我还没有找到一种方法来获取rmdir的错误代码(如果返回的话)。MS-DOS内部命令似乎不返回错误代码。有人能证实吗

使用这些命令的脚本如何知道这些命令是否成功以决定下一步?最简单的方法是读取返回代码(如果返回)


提前谢谢。

不,似乎没有。如果在成功或失败的
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

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

rmdir在成功或失败时返回0。它应该返回一个错误代码,这似乎很直观。但是,其他内部命令会这样做(至少我测试过mkdir和dir命令)

第一个rmdir打印ok,第二个打印err


rmdir是一个内部cmd.exe命令,因此%errorlevel%可能不会更新。

他们会更新,只是很难找到特定命令的文档,但这里有证据证明
rmdir
(根据MS docs它不会返回退出代码)实际上设置了退出代码

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

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

如果
rmdir dodgy
失败,但有一个名为“dodgy”的文件,则您遇到了麻烦:)要测试目录的存在,请使用:
如果存在“dodgy\”
@Wouter,很好的建议,根据需要进行更改,虽然可能远远超出了任何商定的SLA:-)@paxdiablo,但它们确实返回退出代码,只是因为某些原因没有设置errorlevel,但是如果您通过cmd/c,您实际上可以获得代码。我在这里有一条注释,说明DOS命令确实返回错误代码,但我现在从答案和我自己的测试中看到,并非所有命令都是这样(我想这可能与许多“DOS命令”有关)实际上,只是调用%PATH%中的外部可执行文件,这些可执行文件显然在正确返回错误代码方面有所不同。不过,我也不会认为cmd内部命令与错误代码不一致;)另一个MS工作糟糕的例子。任何正确编写的工具都会提供有用的退出代码,但没有。。。不是微软;他们太酷了,不适合那样做。>8^(这是Powershell脚本吗?这与DOS不同(根据问题)。Powershell仅用于启动cmd并读取cmd的退出代码,以证明它是由“rmdir”命令传播的。您可以使用任何其他语言执行相同的操作,语句保持不变-DOS命令确实返回退出代码
$process = Start-Process -FilePath "cmd" -ArgumentList "/c rmdir /q /s C:\folder\unexistingfolder" -NoNewWindow -PassThru -Wait
$process.ExitCode