当前位置: 首页 > news >正文

windows@命令行中获取环境变量取值不展开取值(原值)

文章目录

    • 命令行中获取环境变量取值
      • 获取不展开的值
      • 具体实现
      • 注解
    • 封装为函数
      • 版本1
      • 版本2

命令行中获取环境变量取值

  • 这里主要讨论获取未展开的值
  • 本来获取未展开的值应该作为默认选项,至少有合适的api方便直接调用,但是不知道微软怎么想的,让这个任务变得不直接

获取不展开的值

  • 为了便于讨论和实验,下面假设环境变量都讨论的是当前用户级别的环境变量

  • 意思是假设你的环境变量中有一个 exes变量,并假设对应的取值为 C:\exes

  • 现在某个变量比如 Path,或者其他任何引用了 exes的环境变量(例如 创建环境变量 testx,可以通过语句 setx testx %exes%)

  • 在使用命令行查询 testx时查询到的值不是 %exes%,而是其展开值 C:\exes,这会造成许多间接引用的路径发生更改后无法自动更新,造成灵活性下降,特别是通过命令行修改(尤其是添加)多取值环境变量的部分值的时候

    • 比如 %exes%被改为 C:/new/exes,但是由于添加新值前需要获取旧值,旧值中的 %exes%如果被替换为 C:\exes,那么在为 testx添加新值时丢失 %exes%,取而代之的是 C:\exes ,然而这个值不是我们想要的,因为它是死板的,不会随着 %exes%的更新而自动更新
  • 此外,这里的不展开环境变量主要值的是记录着路径的环境变量)

  • 总之,我们需要解决的问题是命令行获取不展开的值

  • 目前的方法是通过访问注册表来获取不展开的值

  • 相关注册表

    • 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' #系统级
      'HKCU:\Environment' #当前用户级
      
  • 相关命令

    • reg query
    • Get-item

具体实现

推荐powershell的Get-item,即(gi)命令来获取

#以'HKCU:\Environment'为例
# 准备用语测试的一对值
setx exes 'C:\exes1'
setx testx %exes1%#为了获取非展开的原值,可以直接用Get-Item访问'HKCU:\Environment',也可以分为两部分访问路径
#考虑到全局/用户级别环境变量路径都是以environment结尾,这样可以更灵活和选择判断全局还是用户级别
$Name='testx'
#$registerKeyParent=Get-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager'
$registerKeyParent=Get-Item -Path 'HKCU:'#获取目标路径的父路径
$RegisterKey = $registerKeyParent.OpenSubKey('Environment')  #打开指定子键$registryValueOption = [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames$RegisterKey.GetValue($Name, $null, $registryValueOption)

相关api如下

RegistryKey.GetValue 方法 (Microsoft.Win32) | Microsoft Learn

PS> $envRegisterKey.GetValueOverloadDefinitions
-------------------
System.Object GetValue(string name)
System.Object GetValue(string name, System.Object defaultValue)
System.Object GetValue(string name, System.Object defaultValue,
Microsoft.Win32.RegistryValueOptions options)

注解

使用此重载指定检索到的值的特殊处理。 例如,可以在检索类型的RegistryValueKind.ExpandString注册表值时指定RegistryValueOptions.DoNotExpandEnvironmentNames检索字符串,而无需展开嵌入的环境变量。

defaultValue使用 参数指定要返回的值(如果name不存在)。

封装为函数

  • 下面两个版本实现方式不同,注意参数不同,根据需要调整

版本1

来源于scoop中的函数Get-EnvVar

function Get-EnvVarRawValue
{<#.SYNOPSISRetrieve an environment variable value..DESCRIPTIONThis function retrieves the value of the specified environment variable from the registry. It can fetch both user-specific and system-wide variables..PARAMETER NameThe name of the environment variable..PARAMETER GlobalSwitch to indicate if the environment variable is global (system-wide)..EXAMPLEGet-EnvVar -Name "Path"#>param([string]$Name,[switch]$Global)# Determine the appropriate registry key to use based on the Global flag# User scope uses the HKCU hive, while global (system-wide) uses the HKLM hive$registerKey = if ($Global){# HKLM hive is used for system-wide environment variables# This is the same key used by the system Configuration Manager# when setting environment variables through the System Properties# control panelGet-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager'}else{# HKCU hive is used for user-specific environment variablesGet-Item -Path 'HKCU:'}# Open the Environment sub-key off the selected registry key$envRegisterKey = $registerKey.OpenSubKey('Environment')# Retrieve the value of the specified environment variable# The DoNotExpandEnvironmentNames option is used to prevent the registry# from expanding any environment variables it finds in the value# This is necessary because environment variables can be nested (e.g. %PATH%)# and we want to return the raw, unexpanded value$registryValueOption = [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames$envRegisterKey.GetValue($Name, $null, $registryValueOption)
}

版本2

function Get-EnvVarRawValue
{<# .SYNOPSIS从相应的注册表中读取指定环境变量的取值.DESCRIPTION# 不会自动转换或丢失%var%形式的Path变量提取# 采用reg query命令查询而不使用Get-ItemProperty 查询注册表, 因为Get-ItemProperty 会自动转换或丢失%var%形式的变量# 注册表这里也可以区分清楚用户级别和系统级别的环境变量#>[CmdletBinding()]param ([Alias('Name', 'Key')]$EnvVar = 'new', [ValidateSet('Machine', 'User', 'Process')]$Scope = 'User')$currentValue = [System.Environment]::getenvironmentvariable($EnvVar, $Scope)if ($CurrentValue){if ($scope -eq 'User' -or $scope -eq 'Process'){$CurrentValueUser = reg query 'HKEY_CURRENT_USER\Environment' /v $EnvVar$currentValue = $CurrentValueUser}if ($scope -eq 'Machine' -or $scope -eq 'Process'){$currentValueMachine = reg query 'HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' /v $EnvVar$currentValue = $currentValueMachine}if ($Scope -eq 'process'){#recurse$U = Get-EnvVarRawValue -EnvVar $EnvVar -Scope 'User'$M = Get-EnvVarRawValue -EnvVar $EnvVar -Scope 'Machine'$currentValue = (@($U , $M) -join ';') -split ';' | Select-Object -Unique | Remove-RedundantSemicolonreturn $currentValue# $CurrentValue = $CurrentValueUser + $currentValueMachine}$CurrentValue = @($CurrentValue) -join '' #确保$CurrentValue是一个字符串# $CurrentValue -match 'Path\s+REG_EXPAND_SZ\s+(.+)'# $mts = [regex]::Matches($CurrentValue, $pattern)# return $mtsif ($CurrentValue -match 'REG.*SZ\s+(.+)'){$CurrentValue = $Matches[1] | Remove-RedundantSemicolon# 规范化}}if ($VerbosePreference){Write-Verbose "RawValue of [$EnvVar]:"Write-Host ($currentValue -split ';' | Format-DoubleColumn | Out-String)}# 返回的是一个字符串,而不是;分隔的字符串数组return $currentValue 
}

相关文章:

windows@命令行中获取环境变量取值不展开取值(原值)

文章目录 命令行中获取环境变量取值获取不展开的值具体实现注解 封装为函数版本1版本2 命令行中获取环境变量取值 这里主要讨论获取未展开的值本来获取未展开的值应该作为默认选项,至少有合适的api方便直接调用,但是不知道微软怎么想的,让这个任务变得不直接 获取不展开的值 …...

如何找到多平台内容爆款进行批量复刻?

为了进一步扩大品牌社媒影响力&#xff0c;在消费者做决策的时候&#xff0c;能够第一时间出现在首选位置。持续在抖音、小红书、b站、公众号等各大社媒平台&#xff0c;产生连续的、正向的高质量品牌曝光&#xff0c;是非常重要的。如何进行这种多平台品牌影响力的提升呢&…...

【UML】- 用例图(结合银行案例解释其中的奥义)

目录 一、相关介绍 作用&#xff1a; 组成&#xff1a; 关系 二、使用具体银行案例解释各组成部分的含义 1、系统 2、参与者 3、用例 4、关联关系 5、扩展关系 6、泛化&#xff08;继承&#xff09;关系 三、成品 一、相关介绍 作用&#xff1a; 用例图可以描述一个…...

浅谈UI自动化

⭐️前言⭐️ 本篇文章围绕UI自动化来展开&#xff0c;主要内容包括什么是UI自动化&#xff0c;常用的UI自动化框架&#xff0c;UI自动化原理等。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题…...

三、k8s快速入门之Kubectl 命令基础操作

⭐️创建Pod [rootmaster ~]# kubectl run nginx --imageharbor.tanc.com/library/ngix:latest kubectl run --generatordeployment/apps.v1 is DEPRECATED and will be rmoved in a future version. Use kubectl run --generatorrun-pod/v1 or kbectl create instead. deplo…...

深度学习-BP算法详解

BP&#xff08;Back Propagation&#xff0c;反向传播&#xff09;是训练神经网络的重要算法之一。它通过计算误差并将误差反向传播&#xff0c;以更新神经网络中的权重和偏置&#xff0c;进而使模型更好地拟合数据。 1. BP算法的基本原理 反向传播的基本思想是&#xff1a; …...

Java审计对比工具JaVers使用

最近有个需求&#xff0c;需要将页面的内容生成excel或者word文档&#xff0c;而且每次的修改都需要生成新的版本&#xff0c;同时需要记录每次修改变化的内容。我们会把每次的修改的内容提交赋值给一个java对象&#xff0c;同时存储到数据库一条新数据&#xff0c;对应数据表一…...

unity中预制体的移动-旋转-放缩

unity中预制体的移动-旋转-放缩 左上侧竖栏图标介绍Tools(手形工具)Move Tool(移动工具&#xff0c;单位米)Rotate Tool(旋转工具&#xff0c;单位角度)Scale Tool(缩放工具&#xff0c;单位倍数)Rect Tool(矩形工具)Transform Tool(变换工具)图标快捷键对照表工具使用的小技巧…...

【压力测试】如何确定系统最大并发用户数?

一、明确测试目的与了解需求 明确测试目的&#xff1a;首先需要明确测试的目的&#xff0c;即为什么要确定系统的最大并发用户数。这通常与业务需求、系统预期的最大用户负载以及系统的稳定性要求相关。 了解业务需求&#xff1a;深入了解系统的业务特性&#xff0c;包括用户行…...

ubuntu常用基本指令简记

一、在线帮助 1、help Linux命令可以分为内部命令和外部命令&#xff0c;内部命令就是由Linux默认Shell-bash提供的命令&#xff0c;而非bash提供的命令就是外部命令。 对于内部命令&#xff0c;可以使用help命令来获取帮助 形式为 help 指令 2、man 在日常使用中碰到的绝…...

【解决方案】用git reset --hard重置了提交但是发现reset了一些本不该reset的内容,是不是寄了?

使用 git reset --hard [commit_id] 命令后&#xff0c;所有的更改&#xff08;包括暂存区和工作区的更改&#xff09;都会被重置到指定的提交。如果想要撤销这个操作&#xff0c;恢复到重置之前的状态&#xff0c;可以尝试以下方法&#xff1a; 1. 使用 Git Reflog 恢复 Git…...

ACM模式下Java读取控制台输入注意事项及输出规范化

背景 在ACM模式下。需要我们去接受输入的参数&#xff0c;一般是使用Scanner去读取控制台输入的参数System.in。 不熟悉的情况下&#xff0c;很容易出现问题&#xff0c;针对常见的问题做一个总结。 一、nextXxx 如next&#xff0c;nextInt&#xff0c;nextFloat&#xff0c…...

面试题整理 2

总结了本次面试遇到的值得整理记录的面试题。 目录 变量赋值判断 变量判断 Foreach使用 Mysql优化策略 合理的索引设计 查询优化 数据表结构设计 配置优化 合理使用事务 定期维护数据库 使用缓存 监控与性能分析 Redis主从复制 介绍 配置 示例 Redis 数据类型…...

华为自研仓颉编程语言官网上线 首个公测版本开放下载

仓颉编程语言官网正式公开上线&#xff0c;同时首个公测版本开放下载。本次仓颉编程语言官网上线了首页、在线体验、文档、学习、下载、动态以及三方库共六个模块&#xff0c;可供开发和学习和体验。 据悉&#xff0c;仓颉编程语言是在今年6月的华为开发者大会上正式公布&…...

NVR监测软件/设备EasyNVR多品牌NVR管理工具/设备对城市安全有哪些具体益处?

在智慧城市的建设中&#xff0c;各种先进的技术系统正发挥着越来越重要的作用。其中&#xff0c;NVR监测软件/设备EasyNVR作为一种高效的视频边缘计算网关&#xff0c;不仅能够实现视频数据的采集、编码和存储&#xff0c;还能与其他智慧城市系统进行深度集成&#xff0c;共同推…...

MFC工控项目实例二十八模拟量信号每秒采集100次

用两个多媒体定时器&#xff0c;一个定时0.1秒计时&#xff0c;另一个定时0.01秒用来对模拟量信号采集每秒100次。 1、在SEAL_PRESSUREDlg.h中添加代码 class CSEAL_PRESSUREDlg : public CDialo { public:CSEAL_PRESSUREDlg(CWnd* pParent NULL); // standard constructor&a…...

安装scrcpy-client模块av模块异常,环境问题解决方案

背景 使用 pip install scrcpy-client命令出现以下报错 performance hint: av\logging.pyx:232:5: Exception check on log_callback will always require the GIL to be acquired. Possible solutions: 1. Declare log_callback as noexcept if you control the definition …...

硅谷甄选(11)角色管理

角色管理模块 10.1 角色管理模块静态搭建 还是熟悉的组件&#xff1a;el-card、el-table 、el-pagination、el-form <template><el-card><el-form :inline"true" class"form"><el-form-item label"职位搜索"><el-…...

C语言结构体 变量对齐原理

以32位Linux为例&#xff0c;默认对齐值是4. 对齐原则通常有以下几种&#xff1a; 第一个成员在与结构体变量偏移量为0的地址处。其他成员变量要对齐到某个数字&#xff08;对齐参数&#xff09;的整数倍的地址上。结构体总大小为最大对齐参数的整数倍。嵌套结构体要对齐到…...

【oracle】正则表达式

文章目录 1.介绍1.1 什么是正则表达式1.2 什么是Oracle正则表达式 2. Oracle正则表达式的基础知识2.1 常用的元字符2.2 常用的转义序列2.3 常用的量词 3. Oracle正则表达式的函数3.1 REGEXP_LIKE3.2 REGEXP_SUBSTR3.3 REGEXP_REPLACE3.4 REGEXP_INSTR3.5 REGEXP_COUNT 4. Oracl…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...

当下AI智能硬件方案浅谈

背景&#xff1a; 现在大模型出来以后&#xff0c;打破了常规的机械式的对话&#xff0c;人机对话变得更聪明一点。 对话用到的技术主要是实时音视频&#xff0c;简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术&#xff0c;开发自己的大模型。商用方案多见为字节、百…...