c++ - 在 C++ 中定义新的环境变量并在 bat 文件中使用它
问题描述
很简单,我想在 C++ 中使用 SetEnvironmentVariable 定义一个新的环境变量,然后调用一个使用它的 bat 文件。这是我的 C++ 代码;
PROCESS_INFORMATION processInformation = { 0 };
STARTUPINFO startupInfo = { 0 };
SetEnvironmentVariable("GSDebbugingDir", "Hello");
BOOL result = CreateProcess(NULL,
"dummy.bat"),
NULL,
NULL,
FALSE,
CREATE_NO_WINDOW,
NULL,
NULL,
&startupInfo,
&processInformation);
我的 dummy.bat 文件是:
@echo off
echo GSDebbugingDir = %GSDebbugingDir%
if defined GSDebbugingDir mkdir c:\temp\dummy
pause
但这并没有超出 GSDebbugingDir 变量的值。问题是什么?
解决方案
CreateProcess
文档说:
要运行批处理文件,您必须启动命令解释器;将 lpApplicationName 设置为 cmd.exe 并将 lpCommandLine 设置为以下参数:/c 加上批处理文件的名称。
这是有道理的,因为 .bat 文件本身并不是可执行模块。但是,与文档所说的相反,以下代码在UseApplicationName
NOT #defined 的情况下对我有用,即将“cmd.exe”放入commandLine
此外,要查看 bat 文件的输出,您可能需要删除该CREATE_NO_WINDOW
标志
//#define UseApplicationName
#ifdef UseApplicationName
TCHAR commandLine[] = _T(" /c dummy.bat");
#else
TCHAR commandLine[] = _T("cmd.exe /c dummy.bat");
#endif
BOOL result = CreateProcess(
#ifdef UseApplicationName
_T("cmd.exe"),
#else
NULL,
#endif
commandLine,
NULL,
NULL,
FALSE,
0, //CREATE_NO_WINDOW,
NULL,
NULL,
&startupInfo,
&processInformation);
顺便说一句,请注意
此函数的 Unicode 版本 CreateProcessW 可以修改此字符串的内容。因此,此参数不能是指向只读内存的指针(例如 const 变量或文字字符串)。
推荐阅读
- angular - 实施一个
带有灰色标题 - python - 两个不同数据框的两列的 Seaborn 图
- python - 当添加新行时,有什么方法可以从 csv 文件中删除第 100 行(或“最后一行”)?
- android - 从不同的活动 Android 中删除正在运行的服务
- python - get_access_token() 接受 0 个位置参数,但给出了 1 个
- windows - Matlab,Windows 兼容的 Docker 容器无法运行 Azure Devops CI/CD 作业的 Matlab 作业步骤
- python - 你可以在返回值后继续遍历列表吗?
- python - Spyder 无法启动:pyzmq
- vb.net - 彩票软件有问题
- c++ - 正则表达式提升库 regex_search 匹配错误