pushd 寻找系统路径;php调用exe文件

本文介绍了如何解决在Windows环境下使用.bat文件启动其他程序时遇到的路径问题,包括使用pushd命令来确保正确的工作目录,以及如何正确指定.exe文件的路径。

今天一个路径问题费了我好些时间:

start D:\xampp\htdocs\test.bat
could not open input file:haha.php

test.bat的内容是:
php haha.php

haha.php是正常的php程序,我直接点test.bat是可以正常运行haha.php程

序的,就是在DOS命令下start的方式启动不了。


在.bat文件开头
pushd +运行文件的路径,这样,系统就找到真真需要运行文件的系统路径了。(在百度提出来,热心网友 @sudoku52给解答的)


第二种情况:在.bat 文件是启动一个.exe 服务时,提示服务路径不存在时,观察路径,”D:\exserver“  这样经常会出错,把\删掉试试!


php调用exe文件:

$a = exec("start F:\\xampp\\htdocs\\palm\\BDSpiter\\bin\\test.exe",$out,$status);   //绝对路径
//$a = exec("start ./bin/test.exe",$out,$status);  //相对路径

print_r($a);  

print_r($out);  

print_r($status);

<think> 我们正在讨论的是批处理文件(.bat)中的两个命令:`cd`和`pushd`。根据用户的问题和提供的引用,我们需要解释这两个命令的区别。 引用[1]中提到了: pushd 和 popd 切换当前目录 pushd 保存当前目录,并切换到指定的目录 popd 恢复为之前保存的目录 引用[2]中详细说明了当前目录的概念,并提到: cd:显示或更改当前目录 pushd/popd:目录栈操作,可临时切换目录 另外,还提到一个重要的点:脚本启动时的当前目录取决于调用方式,通过资源管理器双击运行时,当前目录是脚本所在目录;通过命令行调用时,则保持命令行的当前目录。 根据这些信息,我们可以总结出: 1. `cd`命令:用于更改当前目录(Change Directory)。它是最基本的目录切换命令,但有一个限制:如果切换的分区不是当前分区,需要使用`/d`参数。例如: cd /d D:\test # 如果当前在C盘,这个命令可以切换到D盘的test目录 如果不加`/d`,则只能在当前分区内切换目录。 2. `pushd`命令:该命令不仅会切换到指定的目录,还会将当前目录保存到一个栈中。同时,它有一个特性:如果指定的目录是网络路径,它会自动映射一个驱动器号(从Z:开始向下分配)并切换到该驱动器。另外,`pushd`可以跨分区切换,无需使用额外的参数。 与`pushd`配套使用的是`popd`命令,用于将当前目录恢复到上一次`pushd`之前的状态(从栈中弹出)。 主要区别: - `cd`只是简单地改变当前目录,而`pushd`在改变目录的同时会记住之前的目录(入栈),以便之后用`popd`返回。 - `pushd`可以处理网络路径(映射为驱动器),而`cd`不能直接映射网络驱动器(需要先用`net use`命令映射)。 - 多次使用`pushd`可以形成一个目录栈(后进先出),而`cd`没有记忆功能,要返回上一个目录只能使用`cd ..`(上一级)或者记住路径再用`cd`切回去。 示例: 假设当前目录是C:\Users\Admin。 使用`cd`命令切换到D:\Data: cd /d D:\Data 此时,当前目录变为D:\Data。如果想回到C:\Users\Admin,我们需要再次使用`cd /d C:\Users\Admin`。 使用`pushd`和`popd`: pushd D:\Data 此时,当前目录变为D:\Data,并且将C:\Users\Admin保存到栈中。然后我们可以继续操作,当需要回到原来的目录时,只需: popd 这样就会回到C:\Users\Admin,同时从栈中移除该记录。 另一个重要的区别:当需要临时切换到另一个目录执行一些操作,然后返回原目录时,使用`pushd`和`popd`非常方便,尤其是在脚本中,这样可以确保无论中间执行了多少次目录切换,最后都能回到起始目录。 引用[2]还提到:当前目录是脚本运行的基石,相对路径都是相对于当前目录的。因此,在脚本中,如果我们不确定当前目录在哪里,或者需要临时切换目录,使用`pushd`和`popd`可以避免混乱。 根据引用[1]中的例子: pushd c:\mp3 # 保存当前目录(比如是d:\mp4)并切换到c:\mp3 ... 执行一些操作 ... popd # 回到d:\mp4 所以,在编写批处理脚本时,如果只是临时切换目录,建议使用`pushd`和`popd`;如果永久切换目录(不需要返回),则使用`cd`。 另外,引用[2]中提到了一个特殊变量`%~dp0`,它表示脚本所在的目录。通常,在脚本开头使用`cd /d %~dp0`可以将当前目录切换到脚本所在目录,这样脚本中使用的相对路径都是相对于脚本目录的,避免因调用方式不同(双击或命令行调用)导致的路径问题。 总结: | 特性 | cd 命令 | pushd 命令 | |------------|--------|------------| | 切换目录 | 是 | 是 | | 记忆目录 | 否 | 是(栈) | | 跨分区切换 | 需要/d | 自动 | | 网络路径支持 | 不支持(需先映射) | 支持(自动映射驱动器) | | 配套返回命令 | 无(需手动) | popd | 因此,在批处理文件中,选择使用哪个命令取决于具体需求。如果只需要切换目录且不需要返回,用`cd`;如果需要临时切换并返回,或者处理网络路径,用`pushd`。 最后,根据要求,我们需要生成相关问题。 相关问题: 1. 批处理文件中如何切换到网络共享文件夹? 2. 如何确保批处理脚本中的相对路径始终相对于脚本所在目录? 3. 批处理文件中如何实现多个目录之间的快速切换? 4. 为什么在批处理脚本中使用`pushd`和`popd`比使用`cd`和`cd ..`更可靠? 5. 批处理文件中的目录栈最大深度是多少? </think>### BAT文件中`cd`和`pushd`命令的区别 在批处理脚本中,`cd`(Change Directory)和`pushd`(Push Directory)都用于目录操作,但核心功能和用途有本质区别: #### 🔄 `cd`命令(基础目录切换) ```batch cd /d D:\Project # 切换到D盘Project目录 ``` 1. **基础功能** - 直接更改当前工作目录 - 需配合`/d`参数切换驱动器(如`cd /d E:\`) - **不保存**原始目录位置 2. **局限性** - 无法直接返回前一个目录 - 多次切换后易丢失原始路径 - 示例: ```batch cd C:\Temp cd D:\Backup # 此时无法直接返回C:\Temp ``` #### 📚 `pushd`/`popd`命令(目录栈管理) ```batch pushd C:\Reports # 保存当前目录并切换 popd # 恢复原始目录 ``` 1. **栈式管理机制** - `pushd`:将当前目录压入栈 → 切换到新目录 - `popd`:从栈顶弹出目录 → 恢复该目录 - 支持**多层嵌套**操作: ```batch pushd A pushd B popd # 回到A popd # 回到初始目录 ``` 2. **高级特性** - 自动处理驱动器切换(无需`/d`参数) - 可映射网络路径为本地驱动器(如`pushd \\Server\Share`) - 完美解决**路径不确定**场景(引用[1]) #### 🆚 核心区别总结 | 特性 | `cd` 命令 | `pushd`/`popd` 命令 | |---------------------|-------------------|--------------------------| | **目录记忆** | ❌ 不保存历史路径 | ✅ 栈式保存/恢复 | | **跨驱动器切换** | 需`/d`参数 | 自动处理 | | **网络路径支持** | ❌ 不支持 | ✅ 自动映射为驱动器 | | **嵌套目录操作** | 复杂且易出错 | ✅ 天然支持多层嵌套 | | **典型应用场景** | 简单目录切换 | 复杂脚本的临时目录切换 | #### 💡 最佳实践建议(引用[2]) 1. 简单场景用`cd`: ```batch cd /d %~dp0 # 切换到脚本所在目录 ``` 2. 复杂操作用目录栈: ```batch pushd %~dp0\Data for %%f in (*.txt) do process_file.bat "%%f" popd ``` 3. **关键原则**: > "当目录名不确定或需要可靠恢复路径时,`pushd/popd`是比`cd`更健壮的解决方案" [^1] #### ⚠️ 注意事项 - 栈溢出风险:Windows默认目录栈深度约**20层** - 错误处理:`popd`在空栈时会报错`目录堆栈为空` - 网络延迟:映射网络路径时可能因连接问题失败
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值