Я пытаюсь использовать Test-Path
в реестре, пример кода:
$RegistryLocation = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"
Это отлично работает:
Test-Path -Path $RegistryLocation
Правда. Теперь без последней звездочки:
$NewRegistryLocation = $RegistryLocation.Split("*")
Test-Path -Path $NewRegistryLocation
Cannot bind argument to parameter 'Path' because it is an empty string.
Но это работает (значение переменной $NewRegistryLocation
):
Test-Path -Path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\"
Что здесь происходит?
$NewRegistryLocation
- это не строка, а массив строк. Вы можете посмотреть его тип по $NewRegistryLocation.GetType()
. Используйте $NewRegistryLocation[0]
Попробуйте заменить эту строчку
$NewRegistryLocation = $RegistryLocation.Split("*")
с этим
$NewRegistryLocation = $RegistryLocation.Split("*")[0]
поэтому ваш NewRegistryLocation
по-прежнему будет содержать строку, а не массив.
Метод Split()
разбивает строку на две части каждый раз, когда находит переданный вами символ (символы), создавая массив. Это не просто удаление символа из конца строки.
В вашем случае есть несколько способов обойти это:
$NewRegistryLocation = $RegistryLocation.Split("*")[0]
Split-Path
(который делает то, что, я думаю, вы намеревались): $NewRegistryLocation = Split-Path -Path $RegistryLocation -Parent
-replace
, чтобы удалить звездочку: $NewRegistryLocation = $RegistryLocation -replace "\*",""
Вероятно, я бы порекомендовал способ 3, поскольку он немного более надежен и «PowerShelly».
Разве
split("*")
не создал бы массив со вторым значением, равным нулю (часть после * в исходной строке)? Нулевое значение приведет к ошибке.