1

我有一个关于语句中的代码块和变量的简单问题。我的脚本收集用户输入并创建一个字符串,稍后可以在 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 语句没有做任何事情。

感谢任何帮助,谢谢。

4

3 回答 3

1

Where-Object脚本块应该评估为布尔值(或可以强制为布尔值的东西)。您只提供了一个字符串,如果不是空的,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
于 2012-10-02T22:36:03.593 回答
0

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

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

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

于 2012-10-02T22:50:23.100 回答
0

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

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

$strfilter 的值是多少?

如果您回显 $strfilter 的值,请尝试在其位置手动输入该值,是否有效?如果是这样,那么话是对的,但执行方法是错误的。

于 2012-10-02T22:38:48.450 回答