Встроенные команды MS-DOS возвращают код ошибки \ выхода? - PullRequest
8 голосов
/ 28 июня 2011

Я не нашел способа получить код ошибки, если он был возвращен, из rmdir. Кажется, что внутренние команды MS-DOS не возвращают код ошибки. Кто-нибудь может это подтвердить?

Как скрипт, использующий эти команды, узнает, были ли команды успешными или неудачными для принятия решения о следующем шаге? Самый простой способ - прочитать их код возврата, если он возвращается.

Заранее спасибо.

Ответы [ 4 ]

16 голосов
/ 28 июня 2011

Нет, похоже, нет. Если вы echo %errorlevel% после успешного или неудачного rmdir, вы получите 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

Тем не менее, я не уверен, что это лучше, чем просто проверять, что каталог исчез после того, как вы его удалите, поскольку он требует от вас запуска нового интерпретатора команд.

5 голосов
/ 28 июня 2011
md test
2>nul rmdir test&&echo ok||echo err
2>nul rmdir test&&echo ok||echo err

Это печатает нормально для первого rmdir и err для второго.

rmdir - это внутренняя команда cmd.exe, поэтому% errorlevel%, вероятно, не обновлен.

4 голосов
/ 28 июня 2011

rmdir вернул 0 при успешном завершении или сбое.Кажется интуитивно понятным, что он должен вернуть код ошибки.Однако другие внутренние команды это делают (по крайней мере, команды mkdir и dir, которые я тестировал)

0 голосов
/ 04 февраля 2016

Да, просто сложно найти документы для определенных команд, но вот доказательство того, что rmdir (который согласно MS docs здесь не возвращает коды выхода) фактически устанавливает код выхода :

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

вывод будет 2, если каталог не существует, существуют другие коды для проблем с разрешениями и т. Д.

...