Я использую 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() для удаления любых начальных или конечных двойных кавычек, но это, кажется, удаляет только начальные двойные кавычки, то есть конечные двойные кавычки остаются на месте. Мне это кажется ошибкой, исходя из моего опыта работы с 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(). Любая помощь приветствуется.

0
Matt Davis 27 Фев 2021 в 23:07

2 ответа

Лучший ответ

То, что вы описываете, завершающая кавычка не удалена означает, что в конце кавычки есть какой-то невидимый символ, например пробел.

Чтобы избавиться от этого, используйте Trim('" ') или соедините два трима вместе, как

Trim().Trim('"')

Первый удаляет все символы пробелов с обеих сторон строки (не только пробелы, но также табуляции, новые строки и т. Д.), А второй - удаляет кавычки.

P.S. Мы не можем видеть, что именно делает ваша функция, но, возможно, вы можете использовать собственный Get-ItemPropertyValue для этого?

1
Theo 27 Фев 2021 в 21:30

Если цитата фиксированная, вы можете 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

1
fourglobe 27 Фев 2021 в 20:36