首页 > 解决方案 > 在 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 变量的值。问题是什么?

标签: c++

解决方案


CreateProcess 文档说:

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

这是有道理的,因为 .bat 文件本身并不是可执行模块。但是,与文档所说的相反,以下代码在UseApplicationNameNOT #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 变量或文字字符串)。


推荐阅读