Powershell - 用变量替换代码块

时间:2012-10-02 22:12:04

标签: variables powershell active-directory

我对语句和变量中的代码块有一个简单的问题。我的脚本收集用户输入并创建一个字符串,以后可以在powershell语句中使用。

$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返回与$ computers相同的结果,这让我相信带有我的字符串变量的Where-object语句没有做任何事情。

感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在您运行此代码的时间点:

$ filteredComputers = $ computers | where-object {$ strFilter}

$ strfilter的价值是多少?

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

答案 2 :(得分:0)

例如,我们只需要从用户文件夹中获取文件夹Documents或“我的文档”:

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

答案由两部分组成: 1)将你的字符串转换为[ScriptBlock] 2)使用&amp;用于调用字符串的字符(即脚本块)