我为模糊的标题道歉,不知道如何对我的问题进行分类。
我有一个脚本,我从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;
}
答案 0 :(得分:1)
默认情况下,子进程继承其进程的环境变量 父进程。由命令处理器启动的程序继承 命令处理器的环境变量。指定不同的 子进程的环境,创建一个新的环境块和 将指针作为参数传递给CreateProcess函数。
另外:确保您的PATH变量不超过maximum allowed size。