powershell@修改@删除@添加环境变量

这篇具有很好参考价值的文章主要介绍了powershell@修改@删除@添加环境变量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

powershell操作环境变量

  • 所作修改长期有效,重启仍然有效
  • 关于查看环境变量,另见它文

范围说明

  • 以下函数支持用户级别和系统级别的更改
  • 默认更改用户级别,系统级别的更改需要以管理员方式运行shell才行
  • 总的来说,这些函数调用简单有效,能够自动更新当前powershell中的环境变量

更新环境变量

  • function Update-EnvVar
    {
        <# 
        .SYNOPSIS
        更新所有环境变量的修改(包括添加新值/移除已有值/修改值),并且会指出那些环境变量被修改了以及修改前后是什么样的
        鉴于Path变量的特殊性,本函数不会处理Path变量
        Update-EnvVar本身不会修改[Environment]中的环境变量,即不会影响系统保存的环境变量,无论是用户级还是系统,只更新当前shell中的环境变量
        对于多个shell窗口同时发生修改环境变量的情形时很有用,当然如果您习惯用GUI修改环境变量,本方法也可以将您的修改同步到当前shell(除了Path变量外)
    
    
        通常调用Set-EnvVar 或Add-EnvVar 更改var环境变量时,会自动更新当前shell的var环境变量($env:var查询到的值)
        但是如果在多个不同的shell窗口内分别调用了Set-EnvVar或Add-EnvVar,那么可能会造成变量信息的不一致
        为了避免这种情况,可以调用此函数更新所有shell的环境变量
        注意本函数以[Environment]对象中存储的环境变量信息为准,如果当前shell的环境变量不同于[Environment]中查询到的那样,则会更新为[Environment]中查询到的值
    
        如果当前shell有不存在于[Environment]中的环境变量,则认为是改shell环境的临时环境变量,调用本函数并不会更改或影响到这些变量
        这些情况是存在的,有些场合下我们只需要创建临时的环境变量而不需要写入系统保存
    
        默认读取的是User级别的环境变量
        .#>
        param(
    
            $Scope = 'User'
        )
        $envs = [System.Environment]::GetEnvironmentVariables($Scope)
        $envs.GetEnumerator() | Where-Object { $_.Key -ne 'Path' } | ForEach-Object {
            # Write-Output "$($_.Name)=$($_.Value)"
            $env_left = "`$env:$($_.Name)"
            $expressoin = "$env_left='$($_.Value)'"
            $current_value = $env_left | Invoke-Expression
            if ($current_value -ne $_.Value)
            {
                Write-Host "$env_left from [$(Invoke-Expression($env_left))] `t to `t [$($_.Value)]" -BackgroundColor Magenta
                $expressoin | Invoke-Expression
            }
        }
    }
    

添加环境变量

  • function Add-EnvVar
    {
        <# 
    .SYNOPSIS
    添加环境变量(包括创建新变量及其取值,为已有变量添加取值),并且立即更新所作的更改
    这里我们利用$expression | Invoke-Expression等方法来手动立即更新当前powershell上下文的环境变量,实现不需要重启更新环境变量
    👺为了确保一致性,且无在不同的powershell窗口分别使用本函数,否则会造成修改覆盖造成修改丢失
    虽然本函数能够刷新当前powershell上下文的环境变量,但是其他shell进程却不会跟着刷新
    
    当对一个已经存在变量添加值时,会在头部插入新值;(有些时候末尾会带有分号,导致查询出来的值可能存在2个来连续的分号)
    这时候可以判断移除最后一个分号,然后再添加新值,头插方式也行
    .EXAMPLE
    PS BAT [10:58:25 PM] [C:\Users\cxxu\Desktop]
    [🔋 100%] MEM:72.79% [5.71/7.85] GB |add-envVar -env_var new2 -new_value v2
    v2
    .EXAMPLE
    PS BAT [10:58:33 PM] [C:\Users\cxxu\Desktop]
    [🔋 100%] MEM:72.74% [5.71/7.85] GB |add-envVar -env_var new2 -new_value v3 -V
    $env:new2 = 'v2;v3'
    v2;v3
    .EXAMPLE
    以管理员权限运行powershell,可以配置系统级别的环境变量
    PS BAT [11:16:24 PM] [C:\Users\cxxu\Desktop]
    [🔋 100%] MEM:73.80% [5.79/7.85] GB |add-envVar -env_var new -new_value v1 -Scope Machine
    v1
    .EXAMPLE
    PS>(Get-EnvVar -Key Path -Scope U|select -ExpandProperty value) -split ';'
    C:\Program Files\PowerShell\7
    C:\Users\cxxu\scoop\shims
    C:\Users\cxxu\AppData\Local\Programs\oh-my-posh\bin
    C:\Users\cxxu\.dotnet\tools
    
    PS>Add-EnvVar -env_var Path -Scope User -new_value NewValueDemo
    NewValueDemo;C:\Program Files\PowerShell\7;C:\Users\cxxu\scoop\shims;C:\Users\cxxu\AppData\Local\Programs\oh-my-posh\bin;C:\Users\cxxu\.dotnet\tools;
    PS>(Get-EnvVar -Key Path -Scope U|select -ExpandProperty value) -split ';'
    NewValueDemo
    C:\Program Files\PowerShell\7
    C:\Users\cxxu\scoop\shims
    C:\Users\cxxu\AppData\Local\Programs\oh-my-posh\bin
    C:\Users\cxxu\.dotnet\tools
    
    #>
        param (
            
            $env_var = 'new',
            $new_value = 'demo_new',
            # choose User or Machine,the former is default(no need for Administrator priviledge)
            # the Machine scope need Administrator priviledge
            [ValidateSet('Machine', 'User')]
            $Scope = 'User',
            [switch]$V,
            [switch]$Query
        )
        # 同步环境变量
        Update-EnvVar -Scope $Scope
        # 先获取当前用户或机器级别的 环境变量 值
        $current_value = [Environment]::GetEnvironmentVariable($env_var, $Scope)
        #查询当前值,能够区分不同Scope的环境变量(例如用户变量和系统变量都有Path,如果只想插入一个新值到用户Path,就要用上述方法访问)
        
    
        # $current_value = "`$env:$env_var" | Invoke-Expression #无法区分用户和系统的path变量
    
        # 添加新路径到现有 Path
        #$current_value如果没有提前设置值,则返回null,而不是'',不能用$current_value -ne '' 判断是否新变量,直接用$current_value 即可
        $new_value = $current_value  ? "$new_value;$current_value" : $new_value 
        # Write-Output $new_value
        
        
        # 清除当前会话的 Path 缓存变量
        # '$env:' + "$env_var" + '="new_value"' |iex
        # Write-Output
        $env_left = "`$env:$env_var"
        $expression = "$env_left = '$new_value'" 
        if ($V -or $Query)
        {
            Write-Host $expression -BackgroundColor green
        }
        if ($Query)
        {
            
            $replay = Read-Host -Prompt 'Enter y to continue,else exit '
            if ($replay -ne 'y')
            {
                return
            }
        }
        # 设置 Scope 级别的 Path 环境变量
        [Environment]::SetEnvironmentVariable($env_var, $new_value, $Scope)
        # 刷新当前shell的环境变量
        $expression | Invoke-Expression
        # return $new_value
        Write-Host "$($env_left)=$new_value" -BackgroundColor Yellow
    
    }
    
    

移除指定的环境变量

  • function Remove-EnvVar
    {
        <# 
        .SYNOPSIS
        移除环境变量
        .EXAMPLE
        批量移除(借助Get-EnvVar 和管道符可以先做模糊匹配,然后通过foreach(%)循环删除,即便本函数暂不支持直接接受管道符输入):    
        Get-EnvVar new*|select name|%{Remove-EnvVar -env_var $_.Name}
    
        #>
        param (
            
            $env_var = '',
            
            # choose User or Machine,the former is default(no need for Administrator priviledge)
            # the Machine scope need Administrator priviledge
            [ValidateSet('Machine', 'User')]
            $Scope = 'User'
        )
        $current_value = "`$env:$env_var" | Invoke-Expression 
        #虽然也可以考虑用Get-EnvVar -key $env_var|select value 查询当前值,但这不一定都是已经生效的值
        # 添加新路径到现有 Path
        #$current_value如果没有提前设置值,则返回null,而不是'',不能用$current_value -ne '' 判断是否新变量,直接用$current_value 即可
        $new_value = $current_value  ? "$current_value;$new_value" : $new_value 
        # Write-Output $new_value
        
        # $expression = "`$env:$env_var = '$new_value'" 
        #当前shell上下文中移掉该环境变量
        if ("`$env:$env_var" | Invoke-Expression)
        {
            # 设置 Scope 级别的 Path 环境$env_var变量为空,从而清除该环境变量(.Net检测到空字符串就移除掉该变量,而不仅仅设置为空字符串)
            [Environment]::SetEnvironmentVariable($env_var, '', $Scope)
            Remove-Item env:$env_var
        }
        else
        {
            Write-Host "No [$env_var] was found! Nothing to Remove."
        }
    
    }
    
    

修改环境变量

  • 组合调用上述两个函数即可文章来源地址https://www.toymoban.com/news/detail-830399.html

    • function Set-EnvVar
      {
          <# 
          .SYNOPSIS
          将已有的环境变量值做修改(增/改/删)
          如果只希望对已有的环境变量添加一个值,例如Path变量追加一个取值,则使用Add-EnvVar处理
          如果想要编辑多个值的变量,例如修改Path变量(删除它的一个路径值),这类情况建议打开gui操作
          当然本命令也是可以改的,在终端中处理字符串却不会比GUI容易执行这类修改
      
      
          .EXAMPLE
          #将new3这个环境变量设置为v3p,无论原来的值是多少(如果原来没有这个环境变量,则新添加一个环境变量)
          Set-EnvVar -env_var new3 -new_value v3p
          .EXAMPLE
          PS>Set-EnvVar -env_var new3 -new_value v3R
          v3R
          PS>$env:new3
          v3R
          PS>Set-EnvVar -env_var new3 -new_value v3S
          v3S
          PS>$env:new3
          v3S
          .EXAMPLE
          PS>$env:new100
          PS>Set-EnvVar -env_var new100 -new_value v100
          v100
          PS>$env:new100
          v100
          .EXAMPLE
          #移除环境变量
          PS>Set-EnvVar -env_var new100 -new_value ''
          PS>$env:new100
          PS>
          #>
          param (                                
              $env_var = '',
              $new_value = 'new_value',
              $Scope = 'User'
          )
          #移除旧值(如果旧值非空的话)
          Remove-EnvVar -env_var $env_var -Scope $Scope
          #添加新值
          Add-EnvVar -env_var $env_var -new_value $new_value -Scope $Scope
      }
      
      

到了这里,关于powershell@修改@删除@添加环境变量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单向带头链表的添加修改删除操作

      双向链表的添加操作

    2024年02月02日
    浏览(39)
  • Mysql,创建/删除表、添加表字段、修改表字段、添加索引等常用语句。

       以下方 user 表为例,讲解如何Mysql创建表语句、添加表字段、修改表字段、添加索引等常用的SQL语句。     出于编写本篇文章的考虑,使用下方建表语句创建的  user表 有很多不合理的地方,例如:teacher_id 是 varchar类型而非 bigint类型、 \\\'创建时间\\\' 有2个字段 等。 大家在自

    2024年02月11日
    浏览(46)
  • Windows注册表脚本文件(简介、添加、修改、删除)

    我们平时大多采用Regedit注册表编辑器来实现对注册表的修改操作,但是这种手工操作费时费力,当你要对多台PC统一修改注册表时,就要怨念了。并且在某些情况下,如果注册表编辑器被禁用了,那么这种方法也会失效。于是,推荐大家使用REG文件来快速完成注册表的修改。

    2024年02月04日
    浏览(49)
  • Docker概念|容器|镜像|命令详细(创建,删除,修改,添加)

    Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源 是在Linux容器里运行应用的开源工具 是一种轻量级的”虚拟机“ Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的,可移植的,自给自足的容器。 docker本质就是宿主机的一个进程,

    2023年04月19日
    浏览(42)
  • [PowerShell] 修改执行策略解决 VSCode 虚拟环境报错“Activate.ps1 cannot...running...on this system.“

    在VSCode中尝试激活python虚拟环境时遇到以下报错信息: 类似问题参考:stackoverflow.com 这个报错信息的意思是: 尝试激活一个python虚拟环境,但是遇到了一个PowerShell的执行策略问题。 PowerShell默认禁止运行没有数字签名的脚本,而虚拟环境的激活脚本可能没有签名。 为了解决

    2024年02月20日
    浏览(42)
  • GIT | 基础操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤销修改 | 删除文件

    Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 我们这里就不多介绍这里的 GIT 了,百度百科和维基百科上都有很多介绍,我们这

    2024年02月05日
    浏览(47)
  • Git添加环境变量

    找到Git安装目录下的bin文件夹目录 如本文为,C:Program FilesGitbin  具体以git安装目录为准 左下角搜索框搜索控制面板,打开控制面板,搜索env  点击编辑系统环境变量 然后点击环境变量 点击下方 系统变量 栏目中的Path,然后点击编辑 点击新建后,将路径输入 如本文路径为

    2024年02月16日
    浏览(34)
  • 添加环境变量

    在很多地方在下载完软件后都需要添加环境变量方可使用。这里以要在终端使用MySQL为例来说一下,在安装好MySQL8.0版本的前提下,如何添加环境变量。 添加环境变量的目的是:输入终端命令时,可以搜索对应的可执行文件。 1.首先找到mysql的安装目录,并且定位到mysql文件,

    2024年02月19日
    浏览(26)
  • nginx脚本,Nginx变量截取字符串,拼接字符串,nginx打印日志,添加修改HTTP请求头,添加修改HTTP响应头

    nginx变量命名,以$开头。 打印日志的目的,是想知道某个变量的值是多少,通过add_header设置响应头,间接地打印日志。 通过设置响应头,然后在浏览器上请求nginx地址,然后得到的响应头,就知道变量值是多少了。 这个需要注意一下,特别是正则 ~   ,后面截取字符串需要

    2024年02月12日
    浏览(72)
  • 博客系统(升级(Spring))(四)(完)基本功能(阅读,修改,添加,删除文章)

    博客系统是干什么的? CSDN就是一个典型的博客系统。而我在这里就是通过模拟实现一个博客系统,这是一个较为简单的博客系统,但是主要功能一个不缺,不过就是 UI 有些 low,我学习前端是为了写后端更加顺手。不至于前后端完全分离,但是有个问题设计的 web 页面不是很

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包