当前位置: 首页 > 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…...

WMIC命令行高效卸载Windows软件:从入门到精通

1. 为什么选择WMIC卸载软件&#xff1f; 每次电脑卡顿的时候&#xff0c;打开C盘一看&#xff0c;总会被各种不明所以的软件占满空间。传统的卸载方式要经过"控制面板-程序和功能-找到目标-点击卸载"的繁琐流程&#xff0c;而WMIC只需要几行命令就能搞定。我在帮同事…...

DLSS Swapper完全指南:5步实现游戏性能自由切换

DLSS Swapper完全指南&#xff1a;5步实现游戏性能自由切换 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾因游戏更新后DLSS版本不兼容导致帧率下降而烦恼&#xff1f;是否想要尝试新版本DLSS功能却发现手动替…...

LTSC-Add-MicrosoftStore:Windows 11 24H2 LTSC应用商店恢复工具实战指南

LTSC-Add-MicrosoftStore&#xff1a;Windows 11 24H2 LTSC应用商店恢复工具实战指南 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 1. 问题本质&…...

SRS+WebRTC直播搭建实录:用安卓手机做推流器的5个关键步骤

SRSWebRTC直播搭建实录&#xff1a;用安卓手机做推流器的5个关键步骤 移动直播的轻量化趋势正在重塑内容创作生态。当专业摄像机与PC推流设备显得笨重时&#xff0c;一台随身携带的安卓手机配合SRSWebRTC技术栈&#xff0c;就能实现低于500ms延迟的直播推流方案。本文将拆解从设…...

HY-Motion 1.0实际效果:关节角度误差<3°、帧间抖动降低50%实测

HY-Motion 1.0实际效果&#xff1a;关节角度误差<3、帧间抖动降低50%实测 1. 效果惊艳的开场 如果你正在寻找一个能够真正理解文字描述并生成高质量3D动作的AI工具&#xff0c;HY-Motion 1.0的表现可能会让你惊喜。经过我们的实际测试&#xff0c;这个基于十亿参数的大模型…...

从火星车到智能家电:聊聊那些藏在身边的RTOS(FreeRTOS、VxWorks、RT-Thread)

从火星车到智能家电&#xff1a;聊聊那些藏在身边的RTOS 当你清晨按下智能咖啡机的启动键&#xff0c;或是用手机远程调节空调温度时&#xff0c;可能不会想到这些设备内部运行着与NASA火星车同源的实时操作系统&#xff08;RTOS&#xff09;。这类专为即时响应设计的系统&…...

PCL-CE深度指南:从基础配置到高级定制的全流程解析

PCL-CE深度指南&#xff1a;从基础配置到高级定制的全流程解析 PCL-CE作为社区驱动的Minecraft启动器增强版&#xff0c;集成了多版本管理、智能模组兼容和网络优化等核心功能&#xff0c;为玩家提供高效便捷的游戏环境配置工具。无论是新手玩家还是资深爱好者&#xff0c;都能…...

【实战篇】Nginx核心配置与性能优化全攻略

1. Nginx基础配置快速上手 第一次接触Nginx时&#xff0c;我被它简洁的配置文件结构惊艳到了。相比其他Web服务器动辄几百行的配置&#xff0c;Nginx的配置文件就像一份精心设计的菜谱&#xff0c;每个指令都恰到好处。先带大家看看最基本的配置结构&#xff1a; # 全局块 user…...

解决图像修复与纹理合成难题的Resynthesizer:开源智能填充工具全指南

解决图像修复与纹理合成难题的Resynthesizer&#xff1a;开源智能填充工具全指南 【免费下载链接】resynthesizer Suite of gimp plugins for texture synthesis 项目地址: https://gitcode.com/gh_mirrors/re/resynthesizer 在数字图像处理领域&#xff0c;我们经常面临…...

Windows安卓应用安装终极指南:告别模拟器,三步完成APK直接运行

Windows安卓应用安装终极指南&#xff1a;告别模拟器&#xff0c;三步完成APK直接运行 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为Windows电脑无法直接运行安…...