我想知道在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
答案 0 :(得分:1)
PowerShell基本上已经使用Where-Object
执行此操作,因此您可以使用它。
[ScriptBlock]
s基本上已经是[string]
。
if ($testString | Where-Object $filter) { <# ... #> }
实际上我现在意识到这不会很有效。但您可以使用Invoke-Expression
代替:
if ((Invoke-Expression $filter)) { <# ... #> }