我对语句和变量中的代码块有一个简单的问题。我的脚本收集用户输入并创建一个字符串,以后可以在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语句没有做任何事情。
感谢任何帮助,谢谢。
答案 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;用于调用字符串的字符(即脚本块)