24

次のコマンドを使用して、Windows に空のファイルを作成するとします。

type nul > C:\does\not\exist\file.txt

ディレクトリが存在しないため、次のエラーが発生します。

The system cannot find the path specified

%errorlevel%出力を印刷すると、次のようになります。

echo %errorlevel%
0

しかし、コマンドは成功しませんでした!

%errorlevel%リダイレクトを使用すると、ウィンドウが最後のコマンドの を設定しないことに気付きました..

これを回避する方法はありますか?

4

2 に答える 2

32

以下を使用できます。

C:\>type nul > C:\does\not\exist\file.txt && echo ok || echo fail
The system cannot find the path specified.
fail

C:\>echo %errorlevel%
1

私はいつも&&と||を想定していました オペレーターはERRORLEVELを使用しましたが、明らかに使用していません。

||を使用した場合にのみ、リダイレクトエラーの後にERRORLEVELが設定されることに非常に興味があります。オペレーター。私は決して推測しなかったでしょう。また、あなたの素晴らしい質問がなければ、私はわざわざテストすることもありませんでした。

リダイレクトが失敗したときにERRORLEVELを設定するだけの場合は、もちろん次のようにすることができます。

type nul > C:\does\not\exist\file.txt || rem
于 2012-04-27T22:02:18.840 に答える
1

コマンド

type nul > C:\does\not\exist\file.txt

存在しないパスで呼び出されたものは、リダイレクトの失敗で終了し、typeまったく呼び出されません。したがって、 を設定する機会はありませんERRORLEVEL。シェルによって実行されるリダイレクトは、設定されませんERRORLEVEL

ERRORLEVEL1 つの解決策は、ゼロ以外の値で事前に初期化することです。type失敗しても変更されず、成功すると (によって) ゼロにリセットされます。

@echo off
::pre-initialise ERRORLEVEL with a value of 1:
call :SETERROR 1
type NUL > NOSUCHDIR\test.txt
IF ERRORLEVEL 1 goto ERROR
echo All is well.
goto END
:ERROR
echo Error detected.
:END
goto :eof
:SETERROR
exit /b %1

短縮形

type NUL > NOSUCHDIR\test.txt && goto OK || goto ERROR

エラーレベルと同じではない終了コードを分析するため、機能します。

終了コードは、リダイレクト演算子 ( を無視する成功/失敗) を使用して直接検出できます。これは、正しく設定されているかどうかに関係なく、 をERRORLEVEL信頼するよりも信頼性が高くなることがよくあります。ERRORLEVEL

Herbert Kleebauerが Usenetグループでこれを説明してくれました。alt.msdos.batch

更新:匿名ユーザーが、コマンド
に基づく代替ソリューションを提案しました:COPY

COPY NUL: C:\does\not\exist\file.txt

このコマンドはERRORLEVEL、スクリプト内の次のコマンドによって分析される可能性のある set を実行します。とても便利なので、提案された編集に感謝します。

于 2019-11-12T08:54:25.287 に答える