【发布时间】: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