在cmd里, 如何在调用.exe前先自动执行.bat?

新手上路,请多包涵

具体比如, 我在使用开源命令行工具bbdown下载b站视频, 一个合法命令比如, bbdown --config-file C:\Users\test\mv.config --help.

为了方便快捷传入不同的配置文件, 我参照chatgpt回答写了一个bbdown.bat, 主要就是先做一个cd然后再调用bbdown.exe, 这样一来就可改用命令bbdown.bat --config-file mv.config --help, 即简化了对配置文件路径的传入.

@echo off
cd "%~dp0"
bbdown %*

但这样键入时, 需要在进入bbdown之后多按一下tab, 才能使之补全为bbdown.bat, 多少还是有点麻烦. 所以请问有没有什么方法能让我在直接调用bbdown.exe时候, 自动先执行bbdown.bat? chatgpt回答用autocmd, 但这就超出我浅显的能力范围了.

ps. 我能想到的另一种间接实现方式是把环境变量pathext里面的.bat和.exe调换顺序, 但不清楚这样做有没有什么坏处. 或者是把bbdown.bat改名为mybbdown.bat之类的, 然后即可只键入mybbdown..., 但还是想知道有没有更优雅的解决方案. 感谢.


再次查询chatgpt, 又看到一个看起来靠谱但试验后无效的方案。把.bat改成.cmd就可以先于bbdown.exe自动执行: 当在终端里输入bbdown.exe时,Windows会先在bbdown.exe所在的目录下寻找是否有同名的.cmd文件。如果有,那么Windows会优先执行这个.cmd文件,然后再执行bbdown.exe。这样就相当于在调用bbdown.exe之前自动执行了你的批处理文件。

阅读 1.4k
2 个回答

bbdown.exe 从环境变量 PATH 中移除。

然后把 .bat 里面的 bbdown 改为完整的路径,比如 C:/app/bbdown.exe,然后把 .bat 文件的目录放到环境变量里面。

这样最为简单。

Windows 环境变量中有一个 PATHEXT 变量,该变量包含 Windows 认为是可执行文件的文件扩展名列表。你将 .BAT 放到 .EXE 前面就可以达成你的目的。(关于 PATHEXT 还可参见 路径信息 - 关于环境变量 - PowerShell | Microsoft Learn

image.png


比如,在文件夹(比如我的是 C:\code\test)中新建 main.cppmain.bat 文件,分贝写入以下内容:

#include <iostream>
using namespace std;
 
int main() 
{
    cout << "Hello, World from exe!" << endl;
    return 0;
}
@echo hello world from bat.

然后执行 g++ main.cpp -o main,此时该文件夹下会有三个文件:

C:\code\test>dir
 驱动器 C 中的卷是 Windows
 卷的序列号是 1858-55DE

 C:\code\test 的目录

2023-10-10  12:33    <DIR>          .
2023-10-10  12:24    <DIR>          ..
2023-10-10  12:32                27 main.bat
2023-10-10  12:35               125 main.cpp
2023-10-10  12:33            60,981 main.exe
               3 个文件         61,133 字节
               2 个目录 250,992,988,160 可用字节

再按顺序执行以下命令,则会有如下结果:

C:\code\test>set PATHEXT
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

C:\code\test>main
Hello, World from exe!

C:\code\test>set PATHEXT=.COM;.BAT;.EXE;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

C:\code\test>set PATHEXT
PATHEXT=.COM;.BAT;.EXE;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

C:\code\test>main
hello world from bat.
附:如果你想在全局生效,还务必要在系统环境变量中修改。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏