0

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

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

我明白是什么pushd "%~1",但2接下来的事情让我感到困惑。然后立即弹出它必须是某种技巧来确定命令行参数是文件名还是文件夹,然后使用错误级别进行相应的分支,但它是如何完成的却是一个谜。

4

1 回答 1

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 上,它写入标准错误。)

于 2016-06-03T04:59:54.950 回答