Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 将当前目录永久添加到Windows路径_Batch File_Command Line_Path_Environment Variables - Fatal编程技术网

Batch file 将当前目录永久添加到Windows路径

Batch file 将当前目录永久添加到Windows路径,batch-file,command-line,path,environment-variables,Batch File,Command Line,Path,Environment Variables,我正在尝试将当前目录(从命令行)永久添加到Windows路径,但在实现此操作时遇到严重问题 我最初的尝试是: set PATH=%PATH%;%cd% 但是,这只在本届会议有效;关闭命令行窗口后,PATH环境变量将保留其以前的值 接下来,我尝试: setx PATH=%PATH%;%cd% 根据我在这里找到的一些答案,这可能适用于Windows 7和8,但在Windows 10中,setx命令有三种工作方式: Syntax 1: SETX [/S system [/U [domain

我正在尝试将当前目录(从命令行)永久添加到Windows路径,但在实现此操作时遇到严重问题

我最初的尝试是:

set PATH=%PATH%;%cd%
但是,这只在本届会议有效;关闭命令行窗口后,
PATH
环境变量将保留其以前的值

接下来,我尝试:

setx PATH=%PATH%;%cd%
根据我在这里找到的一些答案,这可能适用于Windows 7和8,但在Windows 10中,
setx
命令有三种工作方式:

Syntax 1:
    SETX [/S system [/U [domain\]user [/P [password]]]] var value [/M]

Syntax 2:
    SETX [/S system [/U [domain\]user [/P [password]]]] var /K regpath [/M]

Syntax 3:
    SETX [/S system [/U [domain\]user [/P [password]]]]
         /F file {var {/A x,y | /R x,y string}[/M] | /X} [/D delimiters]
长话短说,我无法让它工作:

ERROR: Invalid syntax. Default option is not allowed more than '2' time(s).
如何以最简单的方式完成目标

如果每个Windows版本有不同的语法,那么我也很乐意获得这些信息。

简单解决方案:

setx
的语法与
set
的语法略有不同

使用
设置
,我将执行以下操作:

set PATH=%PATH%;%cd%
使用
setx
,我需要执行以下操作:

setx PATH "%cd"
第一个参数指定环境变量的名称

第二个参数指定要添加到此变量的值

当第二个参数包含空格时,需要双引号


set
也可能是这种情况,顺便说一下。

如回答中详细描述的那样,通过使用本地
路径
将文件夹路径覆盖或附加到注册表中存储的
路径
,从批处理文件中修改系统用户路径,是不好的

@echo 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*" %%N in ('%SystemRoot%\System32\reg.exe query "HKEY_CURRENT_USER\Environment" /v "Path" 2^>nul') do (
    if /I "%%N" == "Path" (
        set "UserPath=%%P"
        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
goto :EOF

:CheckPath
setlocal EnableDelayedExpansion
set "Separator="
if not "!UserPath:~-1!" == ";" set "Separator=;"
if "!UserPath:%%MyAppPath%%=!" == "!UserPath!" (
    set "PathToSet=!UserPath!%Separator%%%MyAppPath%%"
    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 (
        %SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t REG_EXPAND_SZ /d "!PathToSet!" >nul
    )
)
endlocal
endlocal
要将当前目录路径添加到用户
路径
,此任务的一个解决方案是在Windows Vista或更高版本的Windows上使用此代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKEY_CURRENT_USER\Environment" /v "Path" 2^>nul') do (
    if /I "%%N" == "Path" (
        set "UserPath=%%P"
        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
goto :EOF

:CheckPath
setlocal EnableDelayedExpansion
set "Separator="
if not "!UserPath:~-1!" == ";" set "Separator=;"
set "PathCheck=!UserPath!%Separator%"
if "!PathCheck:%CD%;=!" == "!PathCheck!" (
    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
    )
)
endlocal
endlocal
此解决方案的缺点是用户
路径
最终成为例如
C:\Temp;C:\Temp\Other文件夹;当当前目录是第一个
C:\Temp
时,在批处理文件的下一次运行
C:\Temp\Other Folder
时,以及在批处理文件的第三次执行时,
C:\Temp\One More Folder

避免这种情况的解决方案是定义在下一批文件
MyAppPath
中调用的特定于应用程序的环境变量,该变量在批文件执行时总是被覆盖。对于用户
路径
仅添加对环境变量
MyAppPath
的引用(如果用户
路径
中尚未存在)

@echo 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*" %%N in ('%SystemRoot%\System32\reg.exe query "HKEY_CURRENT_USER\Environment" /v "Path" 2^>nul') do (
    if /I "%%N" == "Path" (
        set "UserPath=%%P"
        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
goto :EOF

:CheckPath
setlocal EnableDelayedExpansion
set "Separator="
if not "!UserPath:~-1!" == ";" set "Separator=;"
if "!UserPath:%%MyAppPath%%=!" == "!UserPath!" (
    set "PathToSet=!UserPath!%Separator%%%MyAppPath%%"
    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 (
        %SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t REG_EXPAND_SZ /d "!PathToSet!" >nul
    )
)
endlocal
endlocal
在这种情况下,存储在注册表中的用户
路径
始终只包含
%MyAppPath%
,注册表值的类型为REG\u EXPAND\u SZ。环境变量
MyAppPath
的值也存储在注册表中,但类型为REG_SZ。每次执行批处理文件时,
MyAppPath
的值将更新为当前目录路径。因此,每次从不同的文件夹执行批处理文件时,注册表中的用户
路径
不会变得越来越长

通常,如果应用程序或应用程序套件的应用程序文件夹或其中一个子文件夹在执行应用程序或套件中的任何应用程序时必须位于本地
路径
,则应用程序或应用程序套件的编码不正确。应用程序或应用程序套件还可以将其安装路径存储在注册表中的其他位置,如
应用程序路径
,或存储在
%APPDATA%
(与用户帐户相关的标准应用程序数据路径)子文件夹中的文件中,下次运行时可以从中读取。仅当此应用程序很可能主要由用户在命令提示窗口内执行时,安装程序包才应修改用户系统
路径

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • echo/?
  • endlocal/?
  • 获取/?
  • goto/?
  • 如果/?
  • reg/?
  • reg添加/?
  • reg query/?
  • 设置/?
  • setlocal/?
  • setx/?
还应阅读以下内容:

  • 维基百科的一篇关于
  • 关于解释nul的Microsoft文章
  • 回答有关
    应用程序路径的详细信息
  • 回答有关本地系统用户
    路径
    的详细信息
  • 回答
  • 回答

我会试着省略
=
@Magoo:有趣的是,我刚刚就这么做了;不过运气不好…@Magoo:I得到
错误:无效语法。默认选项不允许超过“2”个时间。
@Magoo:OK,第二个参数的双引号解决了这个问题:
setx路径“%PATH%”;%cd%”
。谢谢你@Magoo:更准确地说:
setx路径“%cd%”
。我上面提到的语法“复制”了整个
路径
(并且大部分将结果截断为1024个字符),这是一个非常糟糕的想法。@goodvibration,这会覆盖用户当前的
路径值
。如果希望每个用户
路径
能够轻松访问此文件,请添加一个展开的
MYPATH
变量(即无百分比变量)。然后在用户
路径中
可以包括
%MYPATH%
。此
MYPATH
值将存储为
REG_SZ
值,因为它没有变量。这一点很重要,因为这意味着在加载
REG\u EXPAND\u SZ
值(如
PATH
)之前,它会在第一个过程中加载。两次加载允许
REG_EXPAND_SZ
v