1

我有一些 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

我不能像 -operator "-eq" 这样使用参数,因为这将是一个错误

有什么办法吗?

4

2 回答 2

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))
于 2016-02-23T16:26:15.540 回答
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")

正则表达式可能的学习曲线,但这是一件很强大的事情。看看这个问题,它涵盖了我将要向您展示的内容。特别是答案以及涵盖锚点的位置。

参考 - 这个正则表达式是什么意思?

于 2016-02-23T17:52:52.770 回答