0

我正在使用 PowerShell 5.1。

我有一个脚本可以从注册表中检索 HKLM:\SYSTEM\CurrentControlSet\Services<service>\ImagePath 值。获得返回的字符串如下所示:

"C:\Program Files\Dir1\Dir2"

请注意,双引号是字符串的一部分。

我需要获取此字符串表示的路径的父目录。我试过Split-Path了,但这会在返回值中留下前导双引号,这会导致Test-Path返回false确实存在的目录。例如,

$key = "HKLM:\SYSTEM\CurrentControlSet\Services\<service>"
$val = "ImagePath"
$dir = Get-RegistryValue $key $val
: "C:\Program Files\Dir1\Dir2"
$parentDir = Split-Path $dir
: "C:\Program Files\Dir1  <--leading double quote
Test-Path $parentDir
: False

为了解决这个问题,我尝试使用Trim()调用来删除任何前导或尾随双引号,但这似乎只是删除了前导双引号,即尾随双引号仍然存在。根据我String.Trim()在 C# 中的经验,这对我来说似乎是一个错误。

$key = "HKLM:\SYSTEM\CurrentControlSet\Services\<service>"
$val = "ImagePath"
$dir = (Get-RegistryValue $key $val).Trim("`"")
: C:\Program Files\Dir1\Dir2"  <-- trailing double quote

唯一可行的方法是将双引号替换为空字符串,如下所示:

$key = "HKLM:\SYSTEM\CurrentControlSet\Services\<service>"
$val = "ImagePath"
$dir = (Get-RegistryValue $key $val).Replace("`"", "")
: C:\Program Files\Dir1\Dir2  <-- no double quotes

但是,这对我来说是错误的。它适用于这种情况,因为路径不能有双引号,即双引号字符是非法的路径变量。但是,如果返回的注册表值在字符串中合法地包含双引号怎么办?这种粗暴的方法将删除该双引号。

我还是 PowerShell 的新手,所以我很可能忽略了一些可以做我想做的事情而不需要我使用Replace()调用的东西。任何帮助是极大的赞赏。

4

2 回答 2

1

如果报价是固定的,您可以 TrimEnd

$dir = (Get-RegistryValue $key $val).TrimEnd('"')

否则你可以像这样进行检查

$key = "HKLM:\SYSTEM\CurrentControlSet\Services\<service>"
$val = "ImagePath"
$tmp = (Get-RegistryValue $key $val)
$dir = if ($tmp.EndsWith('"')) {$tmp.TrimEnd('"')} else {$tmp}

如果有人有更好的答案,我很想看看,因为我从 Powershell 有一段时间了

于 2021-02-27T20:36:01.507 回答
1

您所描述的尾随引号未删除意味着引号后面有一些不可见的字符,例如空格。

为了摆脱它,使用Trim('" ')或链接两个 Trim 就像

Trim().Trim('"')

第一个删除字符串两边的所有空白字符(不仅是空格,还包括制表符、换行符等),然后是第二个删除引号。

PS 我们看不到你的函数到底做了什么,但也许你可以使用 PowerShell 自己的Get-ItemPropertyValue呢?

于 2021-02-27T21:09:30.073 回答