Delphi控制台应用能否获取调用其运行的bat文件所在路径?
问题解答
能否识别程序是由C:\Temp\exec.bat启动的
默认无法直接识别。bat文件属于纯文本脚本,本身不会作为独立进程运行,实际的进程调用逻辑是:系统启动cmd.exe解析bat脚本内容,再由cmd.exe创建你的控制台应用进程,你的程序的直接父进程是cmd.exe。
没有特殊处理的前提下,你无法区分程序是被bat脚本调用启动、是用户手动在cmd窗口输入路径启动,还是用户直接双击exe启动的。
能否获取bat文件所在的C:\Temp路径
分场景判断:
- 不可靠的默认场景:如果你完全不修改bat文件内容,只有用户直接在资源管理器中双击
exec.bat启动程序时,你可以通过GetCurrentDir()拿到工作目录C:\Temp。但如果用户先打开cmd窗口,切换到其他目录后再输入C:\Temp\exec.bat启动,此时程序继承的工作目录是用户切换后的路径,你无法拿到bat所在路径。 - 可靠实现方案(需要修改bat文件内容):
- 方案1:将bat所在路径作为参数传递给程序
bat文件修改为如下内容:
其中"C:\Users\User\Documents\Embarcadero\Studio\Projects\Console App Test\Win32\Debug\ConsoleAppTest.exe" "%~dp0"%~dp0是bat内置变量,代表当前bat文件所在的目录(末尾自带反斜杠),你的程序直接读取ParamStr(1)即可获取到C:\Temp路径。 - 方案2:bat中先切换工作目录再启动程序
bat文件修改为如下内容:
不管用户从哪个目录调用bat,都会先把工作目录切换到bat所在目录再启动程序,你直接调用@echo off cd /d "%~dp0" "C:\Users\User\Documents\Embarcadero\Studio\Projects\Console App Test\Win32\Debug\ConsoleAppTest.exe"GetCurrentDir()就能拿到C:\Temp路径。
- 方案1:将bat所在路径作为参数传递给程序
内容的提问来源于stack exchange,提问作者RaelB。
相关产品推荐
相关产品推荐

