获取批处理文件所在路径

获取批处理文件所在路径

       在开发时,经常需要使用批处理运行一些程序,java程序 犹其是这样,往往需要运行时根路径。Hardcode一个路径总是令自己觉得不自在,例如一个java程序从一台机copy到另外一台机,盘符往往发生变化,先修改一下bat里的路径再运行显然很麻烦。 
       在批处理开头加入cd /d %~dp0 一行代码就真真实实地做到“编写一次,到处运行”。%0是批处理文件本身的路径,%~dp进行扩展, d向前扩展到驱动器,p往后扩展到路径。例如,你的bat文件在e:/mybat/test.bat,则%0就是e:/mybat/test.bat, %~dp0是e:/mybat/。 
        另外,%i提取第i个命令选项,例如%1提取第1个option,i可以取值从1到9 
        %~0: 取文件名(名+扩展名) 
        %~f0:取全路径 
        %~d0:取驱动器名 
        %~p0:只取路径(不包驱动器) 
        %~n0:只取文件名 
        %~x0:只取文件扩展名 
        %~s0:取缩写全路径名 
        %~a0:取文件属性 
        %~t0:取文件创建时间 
        %~z0:取文件大小 
以上选项可以组合起来使用。
在 Windows 批处理(`.bat` 或 `.cmd` 文件)中,获取 **批处理文件自身所在目录** 是一个常见需求,比如你想让脚本读取同目录下的配置文件、工具程序等。 下面详细介绍几种方法,并解释其作用。 --- ## ✅ 目标 假设你的批处理文件位于: ``` C:\MyScripts\tools\run.bat ``` 你希望在 `run.bat` 中获取路径 `C:\MyScripts\tools\`(即文件所在的文件夹),无论用户从哪里调用它。 --- ## ✅ 方法一:使用 `%~dp0`(推荐) ```bat @echo off set SCRIPT_DIR=%~dp0 echo 脚本所在目录是: %SCRIPT_DIR% pause ``` ### 🔍 解释: - `%0` 表示当前批处理文件路径(可能是相对路径或完整路径); - `%~dp0` 是批处理中的“参数扩展”语法: - `%~d0` → 获取盘符(如 `C:`) - `%~p0` → 获取路径(如 `\MyScripts\tools\`) - `%~dp0` → 盘符 + 路径(即完整目录路径) > ⚠️ 注意:末尾带反斜杠 `\`,例如:`C:\MyScripts\tools\` --- ## ✅ 方法二:去掉末尾的反斜杠(更干净) 如果你不想要末尾的 `\`,可以用以下方式: ```bat @echo off set SCRIPT_DIR=%~dp0 set SCRIPT_DIR=%SCRIPT_DIR:~0,-1% echo 脚本所在目录是: %SCRIPT_DIR% pause ``` ### 🔍 解释: - `%SCRIPT_DIR:~0,-1%` 表示字符串截取: - 从第 0 个字符开始,到最后一个字符前结束(去掉最后一个字符 `\`) 结果为:`C:\MyScripts\tools` --- ## ✅ 方法三:引用同目录下的其他文件(实用示例) ```bat @echo off set SCRIPT_DIR=%~dp0 echo 正在运行同目录下的程序... "%SCRIPT_DIR%myapp.exe" --config "%SCRIPT_DIR%config.json" if %errorlevel% neq 0 ( echo ❌ 程序执行失败! exit /b 1 ) echo ✅ 成功完成任务。 pause ``` 这样可以确保即使别人右键“发送到 -> 命令提示符”,也能正确找到资源。 --- ## 📁 对比不同调用方式下的 `%~dp0` | 用户如何运行 | `%~dp0` 的值 | |-------------|-------------| | 双击 `run.bat` | `C:\MyScripts\tools\` | | 在 CMD 中输入 `C:\MyScripts\tools\run.bat` | `C:\MyScripts\tools\` | | 在 CMD 中切换到 D: 盘并运行 `"C:\MyScripts\tools\run.bat"` | `C:\MyScripts\tools\` | | 使用快捷方式指向该 bat 文件 | 仍能正确返回原路径 | ✅ 所以 `%~dp0` 是最可靠的方式! --- ## ⚠️ 常见错误写法 | 错误写法 | 问题说明 | |--------|---------| | `%cd%` | 返回的是当前工作目录,不是脚本所在目录 | | `.` 或 `.\` | 当前目录可能和脚本位置不同 | | `cd` 命令本身 | 不会自动切换到脚本目录 | > ❗除非你显式用 `cd /d %~dp0` 切换目录,否则不要依赖当前路径。 --- ## ✅ 推荐模板(标准开头) ```bat @echo off :: 获取脚本所在目录 set SCRIPT_DIR=%~dp0 :: (可选)切换到脚本目录 cd /d %SCRIPT_DIR% echo 脚本正在 %CD% 下运行 ``` 加上 `cd /d %~dp0` 后,后续所有相对路径都基于脚本所在目录。 --- ## ✅ 示例:完整脚本演示 ```bat @echo off set SCRIPT_DIR=%~dp0 cd /d %SCRIPT_DIR% echo =================================================== echo 欢迎使用 AI 模型启动脚本 echo 当前路径: %CD% echo =================================================== :: 检查是否存在模型启动脚本 if not exist "start_model.py" ( echo ❌ 找不到 start_model.py,请确认文件存在! pause exit /b 1 ) :: 启动 Python 应用 python start_model.py echo. echo ✅ 程序已退出。 pause ``` --- ## ✅ 总结 | 需求 | 写法 | |------|------| | 获取脚本所在目录(含 `\`) | `%~dp0` | | 获取脚本所在目录(不含 `\`) | `%~dp0` + `%var:~0,-1%` | | 切换到脚本所在目录 | `cd /d %~dp0` | | 引用同目录文件 | `"%~dp0myfile.exe"` | 📌 **黄金法则:永远使用 `%~dp0` 来定位脚本所在目录** ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值