将当前目录永久添加到Windows路径中。
将当前目录永久添加到Windows路径中。
我试图将当前目录(从命令行)永久地添加到Windows的路径中,但是在实施这个过程中遇到了严重的问题。
我的初始尝试是:
set PATH=%PATH%;%cd%
然而,这只在当前会话中有效;一旦关闭命令行窗口,PATH
环境变量就会保留其先前的值。
接下来,我尝试了:
setx PATH=%PATH%;%cd%
根据我在这里找到的一些答案,这在Windows 7和8中可能有效,但在Windows 10中,setx
命令有三种工作方式:
语法1: SETX [/S system [/U [domain\]user [/P [password]]]] var value [/M] 语法2: SETX [/S system [/U [domain\]user [/P [password]]]] var /K regpath [/M] 语法3: SETX [/S system [/U [domain\]user [/P [password]]]] /F file {var {/A x,y | /R x,y string}[/M] | /X} [/D delimiters]
长话短说,我无法使其工作:
错误:无效的语法。默认选项不允许超过“2”次。
我该如何以最简单的方式完成我的目标?
如果每个Windows版本有不同的语法,那么我也很乐意获得这些信息。
问题:如何将当前目录永久添加到Windows路径中?
原因:使用不正确的命令语法,导致无法将当前目录添加到Windows路径中。
解决方法:
1. 使用set
命令添加当前目录到路径中:
set PATH=%PATH%;%cd%
2. 使用setx
命令添加当前目录到路径中:
setx PATH "%cd"
注意:使用双引号是为了处理路径中包含空格的情况。
3. 如果想要简化以后扩展用户路径的操作,可以添加一个MYPATH
变量,并在用户路径中包含%MYPATH%
。这样可以通过运行setx MYPATH "%MYPATH%;%CD%"
来扩展MYPATH
变量。同时,还需要修改HKCU\Environment
中的用户路径值,将未扩展的%MYPATH%
变量添加进去。
4. 如果要在脚本中自动完成这个操作,可以使用reg.exe
读取HKCU\Environment
中的"PATH"值,然后使用setx.exe
将新值写回。使用setx.exe
写入新值会发送一个WM_SETTINGCHANGE
消息,使得资源管理器从注册表重新加载环境变量,从而使得后续从资源管理器启动的进程能够使用更新后的环境变量。
以上是完整的解决方法,希望能对大家有所帮助。
问题的原因:在批处理文件中直接通过覆盖或追加文件夹路径到存储在注册表中的PATH来修改系统或用户PATH并不好。
解决方法:通过使用以下代码将当前目录路径添加到用户PATH中来解决这个问题。
off
setlocal EnableExtensions DisableDelayedExpansion
for /F "skip=2 tokens=1,2*" %%G in ('%SystemRoot%\System32\reg.exe query "HKEY_CURRENT_USER\Environment" /v "Path" 2^>nul') do (
if /I "%%G" == "Path" (
set "UserPath=%%I"
if defined UserPath goto CheckPath
)
)
set "UseSetx=1"
if not "%CD:~1024,1%" == "" set "UseSetx="
if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
if defined UseSetx (
%SystemRoot%\System32\setx.exe Path "%CD%" >nul
) else (
%SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t REG_SZ /d "%CD%" >nul
)
endlocal
exit /B
:CheckPath
setlocal EnableDelayedExpansion
if "!UserPath:~-1!" == ";" (set "Separator=") else set "Separator=;"
set "PathCheck=!UserPath!%Separator%"
if not "!PathCheck:%CD%;=!" == "!PathCheck!" goto EndBatch
if not "!PathCheck:%CD%\;=!" == "!PathCheck!" goto EndBatch
set "PathToSet=!UserPath!%Separator%%CD%"
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!" >nul
) else (
set "ValueType=REG_EXPAND_SZ"
if "!PathToSet:%%=!" == "!PathToSet!" set "ValueType=REG_SZ"
%SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t !ValueType! /d "!PathToSet!" >nul
)
:EndBatch
endlocal
endlocal
这种解决方案的缺点是,在当前目录是第一次C:\Temp时,用户PATH最终为C:\Temp;C:\Temp\Other Folder;C:\Temp\One More Folder。对于批处理文件的第二次和第三次执行,用户PATH分别为C:\Temp\Other Folder和C:\Temp\One More Folder。
为了避免这个问题,可以在下一个批处理文件中定义一个特定于应用程序的环境变量MyAppPath,并且每次执行批处理文件时都会覆盖它。只有在用户PATH中不存在对环境变量MyAppPath的引用时,才会将其添加到用户PATH中。
off
setlocal EnableExtensions DisableDelayedExpansion
set "UseSetx=1"
if not "%CD:~1024,1%" == "" set "UseSetx="
if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
if defined UseSetx (
%SystemRoot%\System32\setx.exe MyAppPath "%CD%" >nul
) else (
%SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v MyAppPath /t REG_SZ /d "%CD%" >nul
)
set "UserPath="
for /F "skip=2 tokens=1,2*" %%G in ('%SystemRoot%\System32\reg.exe query "HKEY_CURRENT_USER\Environment" /v "Path" 2^>nul') do (
if /I "%%G" == "Path" (
set "UserPath=%%I"
if defined UserPath goto CheckPath
)
)
if exist %SystemRoot%\System32\setx.exe (
%SystemRoot%\System32\setx.exe Path "%%MyAppPath%%" >nul
) else (
%SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t REG_EXPAND_SZ /d "%%MyAppPath%%" >nul
)
endlocal
这种情况下,注册表中存储的用户PATH始终只包含%MyAppPath%,而注册表值的类型为REG_EXPAND_SZ。环境变量MyAppPath的值也存储在注册表中,但其类型为REG_SZ。每次执行批处理文件时,将MyAppPath的值更新为当前目录路径。因此,注册表中的用户PATH在每次从不同的文件夹运行批处理文件时不会变得越来越长。
如果一个应用程序或应用程序套件的应用程序文件夹或其子文件夹必须在执行应用程序或套件中的任何应用程序时本地PATH中,那么这个应用程序或应用程序套件的编码不好。应用程序或应用程序套件可以将其安装路径存储在注册表的其他位置,如App Paths或%APPDATA%的子文件夹中的文件中,下次运行时可以从中读取。如果这个应用程序主要是由用户在命令提示符窗口中执行的,那么安装程序包应该只修改用户或系统PATH。
要理解使用的命令以及它们的工作原理,请打开命令提示符窗口,执行以下命令,并完整仔细地阅读每个命令显示的帮助页面。
- echo /?
- endlocal /?
- exit /?
- for /?
- goto /?
- if /?
- reg /?
- reg add /?
- reg query /?
- set /?
- setlocal /?
- setx /?
还应阅读以下内容:
- 关于Windows环境变量的维基百科文章。
- 有关使用命令重定向运算符的Microsoft文章,解释了>nul。
- 关于在哪里搜索可执行文件的答案,详细说明了App Paths。
- 关于“X is not recognized as an internal or external command, operable program or batch file”错误的答案,详细说明了本地、系统和用户PATH。
- 有关如何在批处理文件中只设置一次PATH环境变量的答案。
- 有关如何从PATH环境变量中删除特定标记的答案。