从 PowerShell 中的路径变量中删除双引号
Remove double quotes from path variable in PowerShell
我正在使用 PowerShell 5.1。
我有一个脚本可以从注册表中检索 HKLM:\SYSTEM\CurrentControlSet\Services\ImagePath 值。获得 returns 的字符串如下所示:
"C:\Program Files\Dir1\Dir2"
请注意,双引号是字符串的一部分。
我需要获取此字符串表示的路径的父目录。我试过 Split-Path
,但这会在 returned 值中留下前导双引号,这会导致 Test-Path
到 return 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
然而,这对我来说感觉不对。它在这种情况下有效,因为路径不能有双引号,即双引号字符是非法路径变量。但是,如果 returned 注册表值在字符串中合法地包含双引号怎么办?这种粗暴的方法会删除双引号。
我还是 PowerShell 的新手,所以我很可能忽略了一些不需要我使用 Replace()
调用就可以做我想做的事情。非常感谢任何帮助。
如果引用是固定的,你可以 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
您描述的内容 未删除尾引号 表示有一些不可见的字符,例如 space 尾随引号。
要摆脱它,请使用 Trim('" ')
或将两个 Trim 链接在一起,如
Trim().Trim('"')
第一个删除字符串两边的所有白色space字符(不仅是spaces,还有制表符、换行符等),然后第二个删除引号.
P.S。我们看不到你的函数到底做了什么,但也许你可以使用 PowerShell 自己的 Get-ItemPropertyValue?
我正在使用 PowerShell 5.1。
我有一个脚本可以从注册表中检索 HKLM:\SYSTEM\CurrentControlSet\Services
"C:\Program Files\Dir1\Dir2"
请注意,双引号是字符串的一部分。
我需要获取此字符串表示的路径的父目录。我试过 Split-Path
,但这会在 returned 值中留下前导双引号,这会导致 Test-Path
到 return 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
然而,这对我来说感觉不对。它在这种情况下有效,因为路径不能有双引号,即双引号字符是非法路径变量。但是,如果 returned 注册表值在字符串中合法地包含双引号怎么办?这种粗暴的方法会删除双引号。
我还是 PowerShell 的新手,所以我很可能忽略了一些不需要我使用 Replace()
调用就可以做我想做的事情。非常感谢任何帮助。
如果引用是固定的,你可以 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
您描述的内容 未删除尾引号 表示有一些不可见的字符,例如 space 尾随引号。
要摆脱它,请使用 Trim('" ')
或将两个 Trim 链接在一起,如
Trim().Trim('"')
第一个删除字符串两边的所有白色space字符(不仅是spaces,还有制表符、换行符等),然后第二个删除引号.
P.S。我们看不到你的函数到底做了什么,但也许你可以使用 PowerShell 自己的 Get-ItemPropertyValue?