C# 获取文字系统变量路径

C# 获取文字系统变量路径,c#,path,environment-variables,path-variables,raw-data,C#,Path,Environment Variables,Path Variables,Raw Data,有没有办法将path环境变量作为文本字符串而不是扩展的字符串获取 i、 e %systemroot%\System32;%systemroot%\;等等。 而不是 C:\Windows\System32;C:\Windows\;等等。 我试过使用 Environment.GetSystemVariable("Path"); 但这给了我扩展的目录,在这个环境下我看不到任何其他东西可以让我得到它 编辑: patunexpandenvstrings仅当整个路径是环境变量时有效 i、 e C:\Win

有没有办法将path环境变量作为文本字符串而不是扩展的字符串获取

i、 e

%systemroot%\System32;%systemroot%\;等等。

而不是

C:\Windows\System32;C:\Windows\;等等。

我试过使用

Environment.GetSystemVariable("Path");
但这给了我扩展的目录,在这个环境下我看不到任何其他东西可以让我得到它

编辑:

patunexpandenvstrings
仅当整个路径是环境变量时有效

i、 e

C:\Windows\System32;C:\Windows;等等。

变成

C:\Windows\System32;%系统根%;等等。

使用

Registry.GetValue(@“HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment”,“Path”,null)


仍然以
C:\Windows\System32;C:\Windows;等等。

如果您选择注册表路径,您可以通过到获取未扩展路径

使用系统;
使用Microsoft.Win32;
名称空间SO60725684
{
班级计划
{
静态void Main()
{
const string Environment keypath=@“SYSTEM\CurrentControlSet\Control\Session Manager\Environment”;
常量字符串valueName=“TEMP”;
使用(RegistryKey environmentKey=Registry.LocalMachine.OpenSubKey(environmentKeyPath))
{
foreach(Enum.GetValues中的RegistryValueOptions选项(typeof(RegistryValueOptions)))
{
对象valueData=environmentKey.GetValue(valueName,“,选项);
WriteLine($“{valueName}({options})=\“{valueData}\”;
}
}
}
}
}
这张照片

Temp (None) = "C:\WINDOWS\TEMP"
Temp (DoNotExpandEnvironmentNames) = "%SystemRoot%\TEMP"
Name: TEMP
SystemVariable: True
UserName: <SYSTEM>
VariableValue: %SystemRoot%\TEMP

Name: TEMP
SystemVariable: False
UserName: NT AUTHORITY\SYSTEM
VariableValue: %USERPROFILE%\AppData\Local\Temp

Name: TEMP
SystemVariable: False
UserName: ComputerName\UserName
VariableValue: %USERPROFILE%\AppData\Local\Temp
我使用
“TEMP”
变量只是为了简化它的值,但它对
“Path”
也同样有效

如果您不想依赖环境变量的备份存储,还有一种方法可以在不进行扩展的情况下公开值

使用系统;
使用制度管理;
名称空间SO60725684
{
班级计划
{
静态void Main()
{
string[]propertiesToDisplay=新字符串[]{“名称”、“系统变量”、“用户名”、“变量值”};
ObjectQuery=new SelectQuery(“Win32_环境”,“名称='TEMP',属性显示”);
使用(ManagementObjectSearcher search=新的ManagementObjectSearcher(查询))
使用(ManagementObjectCollection resultCollection=searcher.Get())
{
foreach(resultCollection中的ManagementBaseObject resultInstance)
{
PropertyDataCollection属性=resultInstance.properties;
foreach(propertiesToDisplay中的字符串propertyName)
{
PropertyData属性=属性[propertyName];
Console.WriteLine($“{property.Name}:{property.Value}”);
}
Console.WriteLine();
}
}
}
}
}
这张照片

Temp (None) = "C:\WINDOWS\TEMP"
Temp (DoNotExpandEnvironmentNames) = "%SystemRoot%\TEMP"
Name: TEMP
SystemVariable: True
UserName: <SYSTEM>
VariableValue: %SystemRoot%\TEMP

Name: TEMP
SystemVariable: False
UserName: NT AUTHORITY\SYSTEM
VariableValue: %USERPROFILE%\AppData\Local\Temp

Name: TEMP
SystemVariable: False
UserName: ComputerName\UserName
VariableValue: %USERPROFILE%\AppData\Local\Temp
Name:TEMP
系统变量:True
用户名:
变量值:%SystemRoot%\TEMP
姓名:临时雇员
系统变量:False
用户名:NT AUTHORITY\SYSTEM
变量值:%USERPROFILE%\AppData\Local\Temp
姓名:临时雇员
系统变量:False
用户名:ComputerName\UserName
变量值:%USERPROFILE%\AppData\Local\Temp

如您所见,当为多个用户定义变量时,会得到多个结果,因此您需要对
SystemVariable
UserName
属性进行进一步筛选,以获得所需的结果。

为什么要使用环境变量而不是实际路径?通过PInvoke?您可以直接从系统注册表中读取,该注册表位于
HKEY\U LOCAL\U MACHINE\system\CurrentControlSet\Control\Session Manager\Environment
,其中有一个名为
Path
@Amy的
REG\u EXPAND\u SZ
值。我正在尝试将目录附加到当前路径。@stuartd PathUnExpandEnvStrings仅在整个字符串匹配一个环境变量,即C:\Windows\System32不会取消展开,只有C:\Windows会取消展开。@Jeffrey我已经用
System.Management
替代方案更新了我的答案。如果您需要一个类似于
patunexpandenvstrings
的解决方案来处理部分路径,我最近发布了一个尝试使用一组环境变量路径来取消扩展任意路径的解决方案。希望这对于C#来说是可读/可翻译的。