定义C++新的环境变量并在 bat 文件中使用它

Define in C++ new environment variable and use it in bat file

本文关键字:文件 bat C++ 环境变量 定义      更新时间:2023-10-16

这很简单,我想使用 SetEnvironmentVariable 在C++中定义一个新的环境变量,然后调用使用它的 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);

我的虚拟.bat文件是:

@echo off    
echo GSDebbugingDir = %GSDebbugingDir%    
if defined GSDebbugingDir mkdir c:tempdummy    
pause

但这并没有超出GSDebbugingDir变量的值。问题出在哪里?

CreateProcess文档说:

若要运行批处理文件,必须启动命令解释器;将 lpApplicationName 设置为 cmd.exe并将 lpCommandLine 设置为以下参数:/c 加上批处理文件的名称。

这是有道理的,因为.bat文件本身不是可执行模块。 但是,与文档所说的相反,以下代码适用于我UseApplicationName而不是 #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 变量或文本字符串(的指针。