0

バッチ ファイルの 3 行を理解しようとしています。バッチ ファイルは、ファイル名またはフォルダー名を受け入れることができることに注意してください。

pushd "%~1" 2>nul
popd
if not errorlevel 1 goto :IsDir

私は何をするのか理解してpushd "%~1"いますが、2それに続くものは私を困惑させます。次に、コマンドライン引数がファイル名またはフォルダーであるかどうかを判断し、エラーレベルを使用してそれに応じて分岐するための何らかのトリックである必要がありますが、これがどのように達成されるかは謎です.

4

1 に答える 1

0

テストが機能する理由はすべてpushd. 入力がファイル名の場合、pushd失敗し、errorlevel1 に設定されます。一方、入力がディレクトリの場合、pushd成功し、errorlevel0 に設定されます。

popdは変更されずerrorlevel、 の副作用を元に戻すために追加されpushdます。既に遭遇した欠点があります: 以前の成功し pushdた の効果を元に戻します。pushd3 行の前に success があり、入力がファイルの場合、それはそれを元に戻しますpushd

より良いアプローチはpopd、成功した場合にのみ呼び出すことです。

pushd "%~1" 2>nul
if not errorlevel 1 (
    popd
    goto :IsDir
)

(補足:Windows 10でテストすると、pushdは標準出力に書き込みます。Mofiが指摘したように、Windows XPでは標準エラーに書き込みます。)

于 2016-06-03T04:59:54.950 に答える