我试图理解批处理文件中的 3 行。请注意,批处理文件可以接受文件名或文件夹名。
pushd "%~1" 2>nul
popd
if not errorlevel 1 goto :IsDir
我明白是什么pushd "%~1"
,但2
接下来的事情让我感到困惑。然后立即弹出它必须是某种技巧来确定命令行参数是文件名还是文件夹,然后使用错误级别进行相应的分支,但它是如何完成的却是一个谜。
我试图理解批处理文件中的 3 行。请注意,批处理文件可以接受文件名或文件夹名。
pushd "%~1" 2>nul
popd
if not errorlevel 1 goto :IsDir
我明白是什么pushd "%~1"
,但2
接下来的事情让我感到困惑。然后立即弹出它必须是某种技巧来确定命令行参数是文件名还是文件夹,然后使用错误级别进行相应的分支,但它是如何完成的却是一个谜。
测试之所以有效,都是因为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 上,它写入标准错误。)