【问题标题】:Setting PATH variable is not working设置 PATH 变量不起作用
【发布时间】:2014-11-13 02:19:27
【问题描述】:

我为这个模糊的标题道歉,不知道如何分类我的问题。

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

注意:直接运行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;
}

【问题讨论】:

  • 请针对新的不同问题发布新的不同问题

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


【解决方案1】:

来自Windows Dev-center

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2017-10-26
    • 2013-07-13
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多