繁体   English   中英

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

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

很简单,我想在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不#define的,即具有置入“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 变量或文字字符串)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM