2014-09-18 60 views
0

我爲模糊的標題道歉,不知道如何對我的問題進行分類。設置PATH變量不起作用

我有一個腳本,我從Visual Studio 2013項目(C++)調用。在該腳本中,我嘗試設置我的路徑變量。當PATH變量被設置時,它看起來好像是在路徑中包含了visual studio的東西,並且不止一次複製了路徑。不知道爲什麼。

注意:直接運行bat並從命令提示符運行不會出現此錯誤。

的.cpp:

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

    return 0; 
} 

蝙蝠:

:: 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 

UPDATE:

我做了一些關於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; 
} 
+0

請爲一個新的不同的問題發佈一個新的不同的問題 – 2014-09-18 17:41:17

回答

1

Windows Dev-center

通過默認情況下,子進程繼承其父進程的環境變量。由命令處理器啓動的程序將繼承命令處理器的環境變量 。要爲子進程指定不同的 環境,請創建一個新的環境塊,然後將指針作爲CreateProcess函數的參數傳遞給 。

另請確保您的PATH變量不超過maximum allowed size