Windows下获取高权限运行程序的正确工作路径
任务计划最高权限运行时获取EXE正确路径的解决方法
问题核心:用cd命令获取的是当前工作目录,任务计划以最高权限运行时,默认工作目录是C:\Windows\System32,和EXE实际位置无关。要拿到EXE的真实路径,得直接读取进程的可执行文件路径,不能依赖工作目录。
解决方案:使用Windows API获取EXE路径
直接调用Windows原生API GetModuleFileName(),这个函数能获取当前进程可执行文件的完整路径,不受工作目录影响。步骤如下:
- 调用
GetModuleFileName()获取带文件名的完整路径 - 从完整路径中剥离文件名,只保留目录部分
- 处理路径格式(确保末尾带反斜杠,和原代码需求一致)
修改后的代码
#include <windows.h> #include <string.h> bool get_path(Arg* arg) { char full_path[MAX_PATH]; DWORD path_len = GetModuleFileNameA(NULL, full_path, MAX_PATH); // 检查路径获取是否成功或是否超出缓冲区 if (path_len == 0 || path_len >= MAX_PATH) { return 0; } // 找到最后一个反斜杠,剥离文件名部分 char* last_backslash = strrchr(full_path, '\\'); if (last_backslash == NULL) { return 0; } // 截断到目录位置,添加反斜杠和结束符 *last_backslash = '\0'; strcat(full_path, "\\"); // 复制到目标缓冲区,检查长度是否足够 size_t dir_len = strlen(full_path); if (dir_len >= sizeof(arg->workingdir)) { return 0; } strcpy(arg->workingdir, full_path); arg->workingdir_cnt = dir_len; return 1; }
说明
GetModuleFileNameA(NULL, ...):传入NULL表示获取当前进程的可执行文件路径,A版本对应多字节字符集,和原代码的char数组兼容strrchr():定位路径中最后一个反斜杠,以此截断去掉文件名- 最后手动添加反斜杠,和原代码的后续使用需求保持一致
这样不管是普通权限还是任务计划最高权限运行,都能稳定获取到EXE所在的真实目录。
内容的提问来源于stack exchange,提问作者Erz
相关产品推荐
相关产品推荐

