代码之家  ›  专栏  ›  技术社区  ›  Matt Davis

从PowerShell中的path变量中删除双引号

  •  0
  • Matt Davis  · 技术社区  · 4 年前

    我有一个脚本可以检索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() 调用以删除任何前导双引号或尾随双引号,但这似乎只会删除前导双引号,即尾随双引号保持不变。根据我的经验,这看起来像是一个bug 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() 打电话。非常感谢您的帮助。

    1 回复  |  直到 4 年前
        1
  •  1
  •   Theo    4 年前

    意味着在引号后面有一些不可见的字符,比如空格。

    为了摆脱它,使用 Trim('" ') 或者用链子把两个饰件连在一起

    Trim().Trim('"')
    

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

    Get-ItemPropertyValue 为了这个?

        2
  •  1
  •   fourglobe    4 年前

    $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从一段时间以来