pushd / popd 是什么
pushd 把当前目录压栈再切到目标目录,popd 从栈里弹出并回到上一个目录,两者成对使用。它比 cd 多了一层“记得来路”,脚本里只要配对写,就不会因为中途改了目录而在错误位置执行后续命令。它还解决一个 cmd 的老毛病:cmd 默认不允许把 UNC 路径设为当前目录,而 pushd 会自动分配一个临时盘符,让 UNC 变成可用的工作目录。
基本信息
| 适用平台 | Windows 命令提示符(cmd);批处理脚本内可用 |
|---|---|
| 语法 | pushd 路径 … popd |
| 栈特性 | 可嵌套,多次 pushd 后按后进先出顺序 popd 回来 |
| UNC 优势 | pushd \\server\share 自动映射临时盘符,popd 后释放 |
| PowerShell 对应 | Push-Location / Pop-Location(-StackName 可命名多栈) |
| 查看栈内容 | PowerShell 里 Get-Location -Stack 可打印当前栈 |
典型使用场景
- 批处理里临时切目录执行编译、打包,结束后回到调用者的目录
- 脚本骨架用 pushd %~dp0 保证无论从哪里调用都在脚本自身目录执行
- 需要访问 UNC 共享目录且命令要求本地路径时绕开限制
- 嵌套调用多个子脚本,每层各自切换与返回,互不干扰
- 临时盘符映射用完自动释放,不必手工 net use 清理
常用示例
常用示例
pushd D:\Project # 保存当前目录并切到 D:\Project
build.cmd # 在当前目录执行构建
popd # 弹回原目录
pushd \\nas01\share\deploy # UNC 场景:自动映射临时盘符
copy app.zip . # 此时当前目录就是共享目录
popd # 返回并释放临时盘符
pushd %~dp0 # 脚本里固定回到脚本自身目录常见返回与现象
| 现象 | 含义 | 处理 |
|---|---|---|
| 找不到指定的路径 | 目标路径不存在或拼写错误 | 先确认路径,注意 UNC 双反斜杠 |
| UNC 不可用 | 未用 pushd 而直接 cd 到共享 | 改用 pushd 让其分配临时盘符 |
| 脚本后续目录不对 | pushd 与 popd 未配对 | 检查提前 return 或 goto 跳过的分支 |
| 临时盘符冲突 | 已有同名映射占用该盘符 | 清理旧的 net use 映射后重试 |
脚本里最实用的骨架就是在开头写 pushd %~dp0、结尾写 popd:%~dp0 恒为脚本自身所在目录,这样双击运行、计划任务调用、被别人从任意目录调用,行为都一致。
pushd 自动分配的盘符是本次命令解释器会话内的临时映射,popd 之后立即释放;它不会出现在其他窗口,也不需要手工清理。