2012-10-02 181 views
1

我有一个关于语句和变量内代码块的简单问题。我的脚本收集用户输入并创建一个可以在以后的powershell语句中使用的字符串。Powershell - 用变量替换codeblock

$filter = @() 
While ($filter[-1] -ne "end") { 
    $filter += read-host 'Type the name of an OU you want to filter or type "end" to start the script' 
    if ($filter[-1] -eq "end") { 
    break 
    } 
    $strFilter += "`$_`.DistinguishedName -notlike `"*" + $filter[-1] + "*`" " 
    $strFilter += "-and " 
} 
$strFilter = $strFilter.SubString(0,$strFilter.length-5) 

基本上用户将键入然而,许多单词,这些单词将被追加到字符串"$_.DistinguishedName -notlike "*<WORD>*""-and一起扔,直到进入最后一个字。

这部分工作正常,它使用这个生成的字符串来收集似乎没有工作的信息;我有一种感觉,这是非常简单的,我只是想念。

例如:

$computers = get-adcomputer -Filter 'ObjectClass -eq "Computer"' -properties "OperatingSystem","CanonicalName","Description" 
$filteredComputers = $computers | where-object { $strFilter } 

$ filteredComputers返回相同的结果$电脑这使我相信,我的字符串变量在哪里对象的语句没有做任何事情。

感谢任何帮助,谢谢。

回答

1

Where-Object scriptblock应计​​算为布尔值(或可以强制为布尔值的东西)。你只提供一个字符串,如果不是空的话,PowerShell将强制为一个布尔值$ true。尝试这样的事情,而不是:

$strFilter = @() 
while (...) { ... 
    $strFilter += "*$($filter[-1])*" 
} 

$filteredComputers = $computers | 
    Where {$dn=$_.DistinguishedName; @($strFilter | Where {$dn -like $_}).Count -eq 0} 

此使用嵌套管道走路每个过滤项并将其应用到当前对象的distinguishedName来 - 这是我们不得不在嵌套管道$_因为藏匿需要对当前的值$ strFilter数组元素。如果其中任何一个通过like测试,则计数将大于零,并且不会传递到管道中。只有那些不匹配(count == 0)的应该传递给管道。

下面是这种方法的一个例子:

C:\PS> $strFilter = '*ba*','*bog*' 
C:\PS> 'foo','bar','baz','abba','boggle' | 
      Where {$dn=$_; @($strFilter | Where {$dn -like $_}).Count -eq 0} 

foo 
+0

'($ strFilter | Where {$ dn-like $ _})。Count -eq 0'似乎将所有内容标记为false,例如即使它不属于任何域控制器OU,输入字符串“域控制器”仍将返回false。它不是真的,因为有0比赛?也许我误解了一些东西? – smierdziel

+0

这意味着它正在匹配'$ strFilter'中的某个过滤项。'$ strFilter'的内容是什么?也许你在那里有一个过滤条件不应该 - 也许是'**'? –

+0

我不相信'**'正在匹配,如果你在第一个while循环期间按下输入,将实例集合到数组中,那么会出现'**',我通常会检查这个试图过滤我的结果。当我复制粘贴上面的例子时,foo不会被返回。 – smierdziel

0

在某个时间点,当你运行该代码:

$ filteredComputers = $计算机| where-object {$ strFilter}

$ strfilter的值是什么?

如果回显$ strfilter的值,请尝试手动输入它的位置,它是否工作?如果是这样的话是正确的,但执行方法是错误的。

0

例如,我们需要得到的只是该文件夹的文件或从我们的用户文件夹“我的文档”:

[scriptblock]$filterBlock = { $_.Name -like '*ocum*' } 
dir | ?{ & $filterBlock } 

答案由两个部分组成: 1)投你的字符串[脚本块] 2 )使用&字符来调用你的字符串(即你的scriptblock)