2016-04-27 4 views
3

Мне интересно, как или использовать динамические условные параметры при использовании оператора IF в 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

'если ($ (Еогеасп ($ я в $ включить) {если ($ СравниваемаяСтрока -notlike $ я) {$ ложь; разрыв}} $ верно)) {} DoSomething ' – PetSerAl

ответ

1

PowerShell по существу уже делает это с Where-Object, так что вы могли бы просто использовать.

[ScriptBlock] s в основном [string] s уже есть.

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

На самом деле сейчас я понимаю, что не буду совсем работа. Но вы можете использовать Invoke-Expression вместо:

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

Благодарим вас за ответ Брайана, но у меня возникают проблемы с синтаксисом. Я пробовал кучу вариаций, основанных на подробном справочном пособии powershell, и другие примеры, обнаруженные google, но ничего не работает. Если бы вы могли предложить конкретный пример, основанный на моем примере, который был бы очень признателен! –

+0

Это привело меня к правильному ответу, но мне нужна была некоторая переделка. Я включил грубый пример того, как я получил его на работу, но в основном мне нужно было инкапсулировать весь оператор в строку, а не только часть фильтрации, а затем использовать Invoke-Expression. –

Смежные вопросы