IF语句中的动态条件参数?

时间:2016-04-27 20:44:31

标签: powershell

我想知道在PowerShell中使用IF语句时如何使用动态条件参数?

基本上,条件列表可以是1到多个,我将不得不构建某种过滤器,但不知道如何在PowerShell中实现这一点,或者是否可能。

我创建了一个我想要做的小例子,显然在一个真实的例子中,参数将是真正动态的。

$include = @("*dynamic*", "*text*")

$testString = "This is a string of text where I want to match dynamic conditional statements"

$filter = ""

foreach ($i in $include) {
$filter = $([string]::Format('{0} -like "{1}"', $filter, $i))
}

write-host $filter

#What I want it to do in pseduo code
#if ($testString matches $filter) { DoSomething }

#What it should literally do based on above example
if ($testString -like "*dynamic*" -and $testString -like "*text*") { write-host $testString }

这就是我为其他遇到问题而需要更清晰的例子的人所做的工作。我基本上在包含参数的数组内容上使用foreach循环构建语句。如果它是第一个参数,它包含初始IF语句,并且在循环结束后,它将在结束括号上进行处理,以及在满足IF条件时运行的代码。

$include = @("*dynamic*", "*text*")

$testString = "This is a string of text where I want to match dynamic conditional statements"

$varnametocompare = '$testString'

$x = 0
$filter = ""

foreach ($i in $include) {
if ($x -eq 0) {
        $filter = $([string]::Format('if({0} -like "{1}"', $varnametocompare, $i))
        $x++
    }
else {
        $filter = $([string]::Format('{0} -or {1} -like "{2}"', $filter, $varnametocompare, $i))
     }
}
$filter = $([string]::Format('{0}) {{ Write-Host {1} }}', $filter, $varnametocompare))

Invoke-Expression $filter

1 个答案:

答案 0 :(得分:1)

PowerShell基本上已经使用Where-Object执行此操作,因此您可以使用它。

[ScriptBlock] s基本上已经是[string]

if ($testString | Where-Object $filter) { <# ... #> }

实际上我现在意识到这不会很有效。但您可以使用Invoke-Expression代替:

if ((Invoke-Expression $filter)) { <# ... #> }