比较使用powershell params的方法?

时间:2016-02-23 16:17:21

标签: powershell scom

我有一些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”,因为它会出错

有什么办法吗?

2 个答案:

答案 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")

正则表达式可能的学习曲线,但知道它是一个强大的东西。看看这个问题,它涵盖了我要向您展示的内容。特别是答案以及涵盖锚点的地方。

Reference - What does this regex mean?