如何在Windows命令处理器中遍历pushd命令的输出?
在CMD的
for /f中捕获pushd无参数输出的问题 问题现象
当使用for /f %l in ('<command>') do @echo %l解析命令输出时,cd/chdir能正常返回当前目录,但无参数的pushd却无法被for /f捕获输出:
C:\>cd C:\ C:\>for /f %l in ('cd') do @(echo %l) C:\ C:\>pushd Windows C:\Windows>pushd C:\ C:\Windows>for /f %l in ('pushd') do @(echo %l) # 此处无任何输出
原因分析
for /f执行括号内的命令时,会启动独立的CMD子进程运行该命令。- CMD的
pushd/popd目录栈是进程级独立维护的,子进程不会继承父进程的目录栈状态。因此在子进程中执行无参数pushd时,栈为空,没有输出,导致for /f无内容可迭代。 - 你执行的
pushd > nul是在当前父进程中运行的,能正常触发输出,但这和子进程的执行环境无关。
解决方案
要捕获当前shell中pushd的输出,需先在当前进程将输出写入临时文件,再用for /f读取该文件:
分步执行
- 保存
pushd输出到临时文件:
pushd > "%temp%\pushd_stack_top.txt"
- 用
for /f读取文件内容:
for /f %l in ("%temp%\pushd_stack_top.txt") do @echo %l
合并为单条命令
pushd > "%temp%\pushd_stack_top.txt" && for /f %l in ("%temp%\pushd_stack_top.txt") do @echo %l
读取后自动删除临时文件
pushd > "%temp%\pushd_stack_top.txt" && for /f %l in ("%temp%\pushd_stack_top.txt") do @echo %l && del "%temp%\pushd_stack_top.txt"
内容的提问来源于stack exchange,提问作者Michiel van Oosterhout
相关产品推荐
相关产品推荐

