我试图理解批处理文件中的3行。请注意,批处理文件可以接受文件名或文件夹名称。
pushd "%~1" 2>nul
popd
if not errorlevel 1 goto :IsDir
我理解pushd "%~1"
的作用,但跟随它的2
让我感到困惑。
然后立即弹出它必须是某种技巧来确定命令行参数是文件名还是文件夹,然后使用errorlevel进行相应的分支,但它如何实现这一点是一个谜。
答案 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上,它会写入标准错误。)