' pushd" /%~1" 2 - ; NUL'在批处理文件中完成?

时间:2016-06-03 04:17:06

标签: batch-file pushd

我试图理解批处理文件中的3行。请注意,批处理文件可以接受文件名或文件夹名称。

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

我理解pushd "%~1"的作用,但跟随它的2让我感到困惑。 然后立即弹出它必须是某种技巧来确定命令行参数是文件名还是文件夹,然后使用errorlevel进行相应的分支,但它如何实现这一点是一个谜。

1 个答案:

答案 0 :(得分:0)

由于pushd,测试的全部原因。如果您的输入是文件名,则pushd失败并且errorlevel设置为1.另一方面,如果您的输入是目录,则pushd成功且errorlevel为设为0。

popd不会更改errorlevel并添加以恢复pushd的副作用。它确实存在您已遇到的缺点:它会恢复之前成功 pushd的效果。如果在您的三行之前成功pushd,并且输入是文件,则会还原pushd

更好的方法是仅在成功的情况下调用popd

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

(旁注:在Windows 10上测试时,pushd写入标准输出。正如Mofi指出的那样,在Windows XP上,它会写入标准错误。)