在PowerShell中,如果它们是字符串的一部分,我如何转换环境变量(如$ SystemRoot $)?

时间:2013-11-19 12:01:46

标签: regex windows powershell registry environment-variables

我正在尝试编写一个脚本,该脚本从一组注册表项中读取文件路径,但这些路径包含%SystemRoot%in等环境变量。我知道您通常可以使用以下命令查找这些值:

$env:SystemRoot
例如,

。但是,如果PS收到一个字符串,如“%SystemRoot%\ System32 \ Winevt \ Logs \ DebugChannel.etl”,如何将其转换为我需要的完整路径,即“C:\ Windows \ System32 \ Winevt \ Logs \” DebugChannel.etl“?

我尝试使用regex -replace将%%格式转换为$ env:格式:

$_.FileName -replace "%(\w*)%\\", "`$env:`${1}\"

但这只会产生字符串:

$env:SystemRoot\System32\Winevt\Logs\DebugChannel.etl

而且我不确定如何让PowerShell实际评估“$ env:SystemRoot”部分。我认为无论如何都有一种更合理的方法!

我用来获取注册表值并产生上述结果的完整代码是

Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Control\WMI\Autologger | Get-ItemProperty -Name "FileName" -ErrorAction SilentlyContinue | foreach { if($_.FileName) { $_.FileName -replace "%(\w*)%\\", "`$env:`${1}\" } }

感谢。

1 个答案:

答案 0 :(得分:3)

使用.net。试试这个:

 [System.Environment]::ExpandEnvironmentVariables("%SystemRoot%\System32\Winevt\Logs\DebugChannel.etl")