猿问
下载APP

为什么其他文件夹路径也添加到使用SetX的系统PATH而不仅是指定的文件夹路径?

为什么其他文件夹路径也添加到使用SetX的系统PATH而不仅是指定的文件夹路径?

我有一个批处理文件,我从C ++调用system("name.bat")。在该批处理文件中,我试图读取注册表项的值。从C ++调用批处理文件会导致set KEY_NAME=HKEY_LOCAL_MACHINE\stuff失败。

但是,当我直接运行批处理文件(双击它)时,它运行正常。不确定我做错了什么。

批处理文件:

set KEY_NAME=HKEY_LOCAL_MACHINE\SOFTWARE\Ansoft\Designer\2014.0\Desktopset VALUE_NAME=InstallationDirectoryREG QUERY %KEY_NAME% /v %VALUE_NAME%

C ++文件:

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

更新1:

我发现密钥实际上是在64位注册表中,而我正在构建一个32位的C ++解决方案。一旦我修复了它,它发现注册表键很好。

现在我在将该路径添加到PATH变量时出现问题。它不是创建系统变量,而是创建用户变量PATH并将其添加到那里。

从命令行运行。

码:

set KEY_NAME=HKLM\SOFTWARE\Ansoft\Designer\2014.0\Desktop\set VALUE_NAME=InstallationDirectoryFOR /F "usebackq skip=1 tokens=1,2*" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME%`) DO (
   set ValueName=%%A
   set ValueType=%%B
   set ValueValue=%%C)if defined ValueName (
   @echo Value Value = %ValueValue%) else (
   @echo %KEY_NAME%\%VALUE_NAME% not found.):: Set PATH Variableset path_str=%PATH%set addPath=%ValueValue%;echo %addPath%echo %ValueValue%echo %PATH%| find /i "%addPath%">NULif NOT ERRORLEVEL 1 (
   SETX PATH "%PATH%) else (
   SETX PATH "%PATH%;%addPath%;" /M)

更新2:

我移动了选项/ M的位置,现在它正在添加到正确的PATH变量。

但是,当我这样做时,它不止一次添加PATH(3次),然后它还添加了一个到visual studio amd64文件夹的路径。

我很确定为什么会这样。


精慕HU
浏览 43回答 1
1回答

慕妹3242003

Windows会创建流程的整个环境表的副本,从而为新流程启动新流程。因此,在启动C ++应用程序时,您的应用程序将从父进程,Windows资源管理器或Visual Studio中获取包含PATH的环境表。并且在批处理文件的启动时复制此PATHcmd.exe。考虑到从Windows桌面到批处理文件的整个进程树,已经为PATH创建了许多副本,并且某些进程可能会像Visual Studio一样附加到其本地PATH副本,或者甚至从PATH中删除了路径。您现在所做的SETX PATH "%PATH%是将进程树中父进程已经修改的PATH的本地副本完全附加到系统PATH,而不检查重复路径。更好的方法是使用PATH的本地副本丢弃所有代码,而是读取系统PATH的值,检查您要添加的路径是否已经不在系统路径中,如果不是这种情况,请附加您想要的路径要添加到系统路径使用setx。这应该不扩大系统的环境变量进行PATH喜欢%SystemRoot%\System32到C:\Windows\System32。UPDATE以下是在Windows 7 x64和Windows XP x86上测试任务所需的批处理代码。@echo offsetlocal EnableExtensions DisableDelayedExpansionset "KeyName=HKLM\SOFTWARE\Ansoft\Designer\2014.0\Desktop"set "ValueName=InstallationDirectory"for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "%KeyName%" /v "%ValueName%" 2^>nul') do (     if /I "%%N" == "%ValueName%" (         set "PathToAdd=%%P"         if defined PathToAdd goto GetSystemPath     ))echo Error: Could not find non-empty value "%ValueName%" under keyecho        %KeyName%echo/endlocalpausegoto :EOF:GetSystemPathfor /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v "Path" 2^>nul') do (     if /I "%%N" == "Path" (         set "SystemPath=%%P"         if defined SystemPath goto CheckPath     ))echo Error: System environment variable PATH not found with a non-empty value.echo/endlocalpausegoto :EOF:CheckPathsetlocal EnableDelayedExpansionrem The folder path to add must contain \ (backslash) as directoryrem separator and not / (slash) and should not end with a backslash.set "PathToAdd=%PathToAdd:/=\%"if "%PathToAdd:~-1%" == "\" set "PathToAdd=%PathToAdd:~0,-1%"set "Separator="if not "!SystemPath:~-1!" == ";" set "Separator=;"set "PathCheck=!SystemPath!%Separator%"if "!PathCheck:%PathToAdd%;=!" == "!PathCheck!" (     set "PathToSet=!SystemPath!%Separator%!PathToAdd!"     set "UseSetx=1"     if not "!PathToSet:~1024,1!" == "" set "UseSetx="     if not exist %SystemRoot%\System32\setx.exe set "UseSetx="     if defined UseSetx (         %SystemRoot%\System32\setx.exe Path "!PathToSet!" /M >nul     ) else (         set "ValueType=REG_EXPAND_SZ"         if "!PathToSet:%%=!" == "!PathToSet!" set "ValueType=REG_SZ"         %SystemRoot%\System32\reg.exe ADD "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /f /v Path /t !ValueType! /d "!PathToSet!" >nul     ))endlocalendlocal上面的批处理代码使用简单的不区分大小写的字符串替换和区分大小写的字符串比较来检查要追加的文件夹路径是否已存在于系统PATH中。仅当众所周知如何添加文件夹路径并且用户在此期间未在PATH中修改此文件夹路径时,此方法才有效。有关检查PATH是否包含文件夹路径的更安全方法,请参阅如何检查%PATH%中是否存在目录的答案?由Dave Benham撰写。注意1:setx Windows XP上默认不提供命令。注意2: Command setx会将超过1024个字符的值截断为1024个字符。因此,批处理文件使用命令reg替换Windows注册表中的系统PATH(如果其中setx一个不可用或新路径值太长)setx。使用的缺点reg是WM_SETTINGCHANGE消息不会发送到所有顶级窗口,通知运行Windows桌面和其他应用程序的Windows资源管理器有关此系统环境变量的更改。因此,用户必须重新启动Windows,最好始终在持久存储的Windows系统环境变量上更改某些内容。批处理脚本使用PATH进行测试,其中包含当前带有感叹号的文件夹路径,文件夹路径用双引号括起来,仅当文件夹路径包含分号时才需要。要了解使用的命令及其工作方式,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。echo /?endlocal /?for /?goto /?if /?pause /?reg /?并reg add /?与reg query /?set /?setlocal /?setx /?
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答