我有一些ps代码,通过http下载xml并检查其中的一些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
之外没什么问题我不能使用param like -operator“-eq”,因为它会出错
有什么办法吗?
答案 0 :(得分:2)
您可以动态生成scriptblock:
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))
答案 1 :(得分:0)
如果你只使用正则表达式,我觉得你可以简化这个。那么您不必担心动态运算符。您只是在进行字符串比较,因此您可以使用正确的模式获得等效的-like
-match
和-eq
。
if ($xmlvalue.'#text' -match $pattern){
$state = 'OK'
Write-Host 'ok'
}
我会像那样离开if条件。 $pattern
就是你要改变的。
^text
text$
^text$
text
只需要注意正则表达式元字符的含义。您始终可以使用正则表达式转义方法,因此您不必担心这些。所以一个简单的字符串包含例子:
$pattern = [regex]::escape("c:\temp")
正则表达式可能的学习曲线,但知道它是一个强大的东西。看看这个问题,它涵盖了我要向您展示的内容。特别是答案以及涵盖锚点的地方。