【问题标题】:Remove double quotes from path variable in PowerShell从 PowerShell 中的路径变量中删除双引号
【发布时间】:2021-05-29 20:25:17
【问题描述】:

我使用的是 PowerShell 5.1。

我有一个脚本可以从注册表中检索 HKLM:\SYSTEM\CurrentControlSet\Services\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() 调用来删除任何前导或尾随双引号,但这似乎只是删除了前导双引号,即尾随双引号仍然存在。根据我在 C# 中使用 String.Trim() 的经验,这对我来说似乎是一个错误。

$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() 调用就可以完成我想做的事情。非常感谢任何帮助。

【问题讨论】:

  • Trim('"') 不工作?也许还有尾随的不可见字符..你可以试试Trim('" ')
  • Trim('"') 留下相同的尾随引号。我试过Trim('" ') 并且有效,所以那里必须有一些尾随空格。没有想过要尝试,所以对此表示赞赏。这是最好的方法吗?
  • 肯定有正则表达式方法,但是 Trim 很快,每个字符串都有那个方法,所以.. 你也可以菊花链:Trim().Trim('"') 先去掉所有周围的空格,然后取消引用跨度>

标签: c# string powershell windows-10 powershell-5.1


【解决方案1】:

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

要摆脱这种情况,请使用 Trim('" ') 或将两个 Trim 链接在一起,例如

Trim().Trim('"')

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

附:我们无法看到您的函数究竟做了什么,但也许您可以使用 PowerShell 自己的Get-ItemPropertyValue 来实现这一点?

【讨论】:

  • 我在后台使用Get-ItemProperty。我的Get-RegistryValue 包含其他一些检查。感谢您的帮助。
【解决方案2】:

如果报价是固定的东西,你可以 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

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 2015-07-26
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2017-10-28
    • 2022-07-03
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多