加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何将变量的值保留在使用“延迟扩展本地”模式的Windows批处理

发布时间:2020-12-13 22:42:29 所属栏目:Windows 来源:网络整理
导读:上下文:我需要调用一个 Windows批处理脚本,它会通过在其末尾添加另一个路径’xxx’来更新我的PATH,但是: 没有任何重复 (如果我将’xxx’添加到像’aaa; xxx; bbb’这样的PATH中,我需要更新的PATH,比如’aaa; bbb; xxx’) 没有任何聚合 (我可以反复调用脚本
上下文:我需要调用一个 Windows批处理脚本,它会通过在其末尾添加另一个路径’xxx’来更新我的PATH,但是:

>没有任何重复
(如果我将’xxx’添加到像’aaa; xxx; bbb’这样的PATH中,我需要更新的PATH,比如’aaa; bbb; xxx’)
>没有任何聚合
(我可以反复调用脚本而不用’aaa; bbb; xxx; xxx; xxx; ……’

我试过的:

以下功能负责处理任何重复并完成工作

:cleanAddPath -- remove %~1 from PATH,add it at the end of PATH
SETLOCAL ENABLEDELAYEDEXPANSION
set PATH=!PATH:%~2=!
set PATH=!PATH:;;=;!
set PATH=%PATH%;%~2
set P=!P:;;=;!
echo %PATH%
echo -------------
ENDLOCAL  
exit /b

但是,它需要delayed expansion local mode,这意味着:在脚本的末尾(或者在这里,在函数cleanAddPath的末尾),丢弃为%PATH%设置的任何内容.

我可以要求用户(我为其编写脚本)使用cmd / V:ON选项启动他们的cmd(激活延迟扩展,否则默认关闭),但这是不切实际的.

如何按照上面描述的方式修改PATH变量,并在调用所述脚本后仍然在当前的DOS会话中更新它?

页面“ DOS – Function Collection”提供了一个很好的例子,说明函数如何在DOS中返回值,即使使用 delayed expansion模式:

以下函数将使用添加PATH更新所需的任何变量:

:cleanAddPath -- remove %~2 from %~1,add it at the end of %~1
SETLOCAL ENABLEDELAYEDEXPANSION
set P=!%~1!
set P=!P:%~2=!
set P=!P:;;=;!
set P=!P!;%~2
set P=!P:;;=;!
(ENDLOCAL & REM.-- RETURN VALUES
  SET "%~1=%P%"
)
exit /b

请注意使用的路径串联.截止日期:jeb comments:

The line set P=%P%;%~2 is critical if your path contains ampersands like in C:Documents&Settings.
Better change to set “P=!P!;%~2“.

SET“%~1 =%P%”是允许记忆(在由%~1表示的变量中)使用延迟扩展特征设置的值的部分.
我最初使用SET“%~1 =%P%”!,但是jeb comments:

The command SET "%~1=%P%" ! could be simplified to SET "%~1=%P%" as the trailing exclamation mark has only a (good) effect in delayed expansion mode and if you prepared %P% before.

要更新PATH变量,可以使用以下命令调用函数:

call :cleanAddPath PATH "C:mypathtoadd"

对于当前的DOS会话,它将在离开该脚本后继续存在.

dbenham的answer指向一个更健壮的答案(upvoted),但在我的情况下这个脚本就足够了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读