设置PATH变量不工作 [英] Setting PATH variable is not working

查看:125
本文介绍了设置PATH变量不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的模糊标题道歉,不知道如何归类我的问题。

我有一个剧本,我从一个Visual Studio 2013项目(C ++)调用。在这个剧本,我尝试设置我的路径变量。当PATH变量被设置,就好像它是包括路径Visual Studio中的东西,复制路径不止一次。不知道为什么。

请注意:直接运行蝙蝠,并从命令提示符下运行没有present此错误

的.cpp:

  INT主要(无效)
{
    系统(CALL C:\\\\ \\\\ HFSS setup_vars.bat);    返回0;
}

蝙蝠:

  ::设置PATH变量
集path_str =%PATH%
设置让addpath =%ValueValue%回声%让addpath%
回声%ValueValue%暂停回声%PATH%|发现/我%让addpath%> NULIF NOT ERRORLEVEL 1(
   SETX PATH%PATH%
)其他(
   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)的\\微软的Visual Studio 12.0 \\;
C:\\ Program Files文件(x86)的\\微软的Visual Studio 12.0 \\ VC \\ BIN \\ AMD64


更新:

我做的CreateProcess以及如何创建一个新的环境块。一些调查

以下code触发一个破发点:

 的#include<&iostream的GT;#包括LT&;&WINDOWS.H GT;
#定义WINDOWS_LEAN_AND_MEAN#包括LT&;&strsafe.h GT;的#define BUFSIZE 4096INT主要(无效)
{
    LPTSTR lpszCurrentVariable;
    TCHAR szAppName [] = TEXT(C:\\\\ \\\\窗户\\\\ SYSTEM32 CMD.EXE);    STARTUPINFO SI;
    PROCESS_INFORMATION PI;
    BOOL fSuccess;    LPSTR lpszVariable;
    LPWCH lpvEnv;    lpvEnv = GetEnvironmentStrings();    如果(lpvEnv == NULL)
    {
        性病::法院LT&;< GetEnvironmentStrings()失败\\ n;
        系统(暂停);
        返回0;
    }    lpszCurrentVariable = lpvEnv;    如果(FreeEnvironmentStrings(lpvEnv)!= 0)
    {
        性病::法院LT&;< !释放的块\\ n;
    }    如果(失败(StringCchCopy(lpszCurrentVariable,BUFSIZE,LMyNewOwnEnvSetting = 2.0版)))
    {
        系统(暂停);
        返回1;
    }    lpszCurrentVariable + = lstrlen(lpszCurrentVariable)+ 1;
    如果(失败(StringCchCopy(lpszCurrentVariable,BUFSIZE,LMyNewOwnVar = mypath中)))
    {
        性病::法院LT&;< StringCchCopy() - 字符串拷贝#2失败\\ n;
        系统(暂停);
        返回1;
    }    lpszCurrentVariable + = lstrlen(lpszCurrentVariable)+ 1;
    * lpszCurrentVariable =(WCHAR)0;
    SecureZeroMemory(安培; SI,的sizeof(STARTUPINFO));
    si.cb = sizeof的(STARTUPINFO);    fSuccess =的CreateProcess(szAppName,LC:\\ HFSS \\ setup_vars.bat,NULL,NULL,TRUE,NULL,(LPVOID)lpszCurrentVariable,NULL,&放大器; SI,&放大器; PI);
    DWORD RET = WaitForSingleObject的(pi.hProcess,INFINITE);    系统(暂停);
    返回0;
}

我不确信整个以下行应该做什么:

 如果(失败(StringCchCopy(lpszCurrentVariable,BUFSIZE,LMyNewOwnEnvSetting = 2.0版)))
{
    系统(暂停);
    返回1;
}lpszCurrentVariable + = lstrlen(lpszCurrentVariable)+ 1;
如果(失败(StringCchCopy(lpszCurrentVariable,BUFSIZE,LMyNewOwnVar = mypath中)))
{
    性病::法院LT&;< StringCchCopy() - 字符串拷贝#2失败\\ n;
    系统(暂停);
    返回1;
}


解决方案

从的 Windows开发人员中心


  

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


另外:请确保您的PATH变量不超过的允许的最大值

I apologize for the vague title, was not sure how to categorize my problem.

I have a script which I call from a Visual Studio 2013 project (C++). In that script, I try to set my path variable. When the PATH variable gets set, it seems like the it is including visual studio stuff in the path and copying the path more than once. Not sure why.

Note: Running the bat directly and running from the command prompt does not present this error.

.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%;"
)

Path which gets added:

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:

I did some research on CreateProcess and how to create a new environment block.

The following code triggers a break point:

#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;
}

I am not entire sure what the following lines are supposed to be doing:

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;
}

解决方案

From Windows Dev-center

By default, a child process inherits the environment variables of its parent process. Programs started by the command processor inherit the command processor's environment variables. To specify a different environment for a child process, create a new environment block and pass a pointer to it as a parameter to the CreateProcess function.

Also: make sure your PATH variable doesn't exceed the maximum allowed size.

这篇关于设置PATH变量不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆