设置PATH变量不起作用

时间:2014-09-18 16:23:22

标签: c++ batch-file path environment-variables

我为模糊的标题道歉,不知道如何对我的问题进行分类。

我有一个脚本,我从Visual Studio 2013项目(C ++)调用。在该脚本中,我尝试设置我的路径变量。当PATH变量被设置时,它似乎在路径中包含visual studio stuff并且不止一次地复制路径。不知道为什么。

注意:直接运行bat并从命令提示符运行不会出现此错误。

的.cpp:

int main(void)
{
    system("CALL C:\\HFSS\\setup_vars.bat");

    return 0;
}

.BAT:

:: Set PATH Variable
set path_str=%PATH%
set addPath=%ValueValue%

echo %addPath%
echo %ValueValue%

PAUSE

echo %PATH%| find /i "%addPath%">NUL

if NOT ERRORLEVEL 1 (
   SETX PATH "%PATH%
) else (
   SETX /M PATH "%PATH%;%addPath%;"
)

添加的路径:

C:\Program Files\AnsysEM\AnsysEM15.0\Win64;
C:\Program Files\AnsysEM\AnsysEM15.0\Win64;
C:\Program Files\AnsysEM\AnsysEM15.0\Win64;
C:\Program Files\AnsysEM\AnsysEM15.0\Win64;
C:\Program Files\AnsysEM\AnsysEM15.0\Win64;
C:\Program Files (x86)\Microsoft Visual Studio 12.0\;
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64

更新:

我对CreateProcess以及如何创建新的环境块做了一些研究。

以下代码触发断点:

#include <iostream>

#include <Windows.h>
#define WINDOWS_LEAN_AND_MEAN

#include <strsafe.h>

#define BUFSIZE 4096

int main(void)
{
    LPTSTR lpszCurrentVariable;
    TCHAR szAppName[] = TEXT("C:\\windows\\system32\\cmd.exe");

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    BOOL fSuccess;

    LPSTR lpszVariable;
    LPWCH lpvEnv;

    lpvEnv = GetEnvironmentStrings();

    if (lpvEnv == NULL)
    {
        std::cout << "GetEnvironmentStrings() Failed\n";
        system("Pause");
        return 0;
    }

    lpszCurrentVariable = lpvEnv;

    if (FreeEnvironmentStrings(lpvEnv) != 0)
    {
        std::cout << "Freed block!\n";
    }

    if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, L"MyNewOwnEnvSetting=ver 2.0")))
    {
        system("Pause");
        return 1;
    }

    lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
    if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, L"MyNewOwnVar=MyPath")))
    {
        std::cout << "StringCchCopy() - String copy #2 failed\n";
        system("Pause");
        return 1;
    }

    lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
    *lpszCurrentVariable = (WCHAR)0;


    SecureZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);

    fSuccess = CreateProcess(szAppName, L"C:\HFSS\setup_vars.bat", NULL, NULL, TRUE, NULL, (LPVOID)lpszCurrentVariable, NULL, &si, &pi);


    DWORD ret = WaitForSingleObject(pi.hProcess, INFINITE);

    system("Pause");
    return 0;
}

我不完全确定以下几行应该做什么:

if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, L"MyNewOwnEnvSetting=ver 2.0")))
{
    system("Pause");
    return 1;
}

lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, L"MyNewOwnVar=MyPath")))
{
    std::cout << "StringCchCopy() - String copy #2 failed\n";
    system("Pause");
    return 1;
}

1 个答案:

答案 0 :(得分:1)

来自Windows Dev-center

  

默认情况下,子进程继承其进程的环境变量   父进程。由命令处理器启动的程序继承   命令处理器的环境变量。指定不同的   子进程的环境,创建一个新的环境块和   将指针作为参数传递给CreateProcess函数。

另外:确保您的PATH变量不超过maximum allowed size