Способ использования параметров PowerShell в сравнении?
У меня есть некоторый код PS, который загружает XML через HTTP и проверить некоторые XML в нем
[xml]$stuff = $wc.DownloadString('url')
$xmlvalue = $stuff.SelectSingleNode('xpath')
if ($xmlvalue.'#text' -eq "value")
{
$state = 'OK'
Write-Host 'ok'
}
Все, что мне нужно, это возможность запустить этот скрипт как
script.ps1 -url -xpath -operator -value
Это вообще не проблема, кроме оператора
Я не могу использовать параметр как -operator "-eq", потому что это будет ошибка
Есть ли способ сделать это?
2 ответа
Вы можете создать скрипт-блок на лету:
Param
(
[string]$Url,
[string]$Xpath,
[ValidateSet('eq', 'ne', 'like')]
[string]$Operator,
[string]$Value
)
[xml]$stuff = $wc.DownloadString('url')
$xmlvalue = $stuff.SelectSingleNode('xpath')
$ScriptBlock = @'
if($xmlvalue.'#text' -{0} "value")
{{
$state = 'OK'
Write-Host 'ok'
}}
'@ -f $Operator
. $([scriptblock]::Create($ScriptBlock))
Я чувствую, что вы могли бы упростить это, если бы вы использовали вместо этого регулярное выражение. Тогда вам не нужно беспокоиться о динамических операторах. Вы просто проводите сравнение строк, чтобы получить эквивалент -like
-match
а также -eq
с правильным рисунком.
if ($xmlvalue.'#text' -match $pattern){
$state = 'OK'
Write-Host 'ok'
}
Я бы оставил условие if просто так. $pattern
это то, что вы изменили бы.
- Начинается с:
^text
- Заканчивается на "
text$
- Равно:
^text$
- Строка содержит:
text
Просто нужно быть осторожным в отношении метасимволов регулярных выражений. Вы всегда можете использовать метод побег regex, чтобы вам не пришлось беспокоиться об этом. Таким образом, простая строка содержит пример:
$pattern = [regex]::escape("c:\temp")
Возможно изучение кривой с регулярным выражением, но это мощная вещь, чтобы знать. Посмотрите на этот вопрос, который охватывает то, что я собираюсь показать вам. Конкретно ответ и где это охватывает якоря.