Variables Powershell-使用变量替换代码块
我有一个关于语句中的代码块和变量的简单问题。我的脚本收集用户输入并创建一个字符串,该字符串可在以后的powershell语句中使用Variables Powershell-使用变量替换代码块,variables,powershell,active-directory,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") { br
$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)
基本上,用户将输入任意多的单词,这些单词将被附加到字符串“$”中。DifferentizedName-不象“**”
,并将它们与和
一起扔到一起,直到输入最后一个单词
这部分工作正常,它使用生成的字符串来收集似乎不起作用的信息;我有一种感觉,这是一件非常简单的事情,我只是错过了
例如:
$computers = get-adcomputer -Filter 'ObjectClass -eq "Computer"' -properties "OperatingSystem","CanonicalName","Description"
$filteredComputers = $computers | where-object { $strFilter }
$filteredComputers返回与$computers相同的结果,这使我相信带有字符串变量的Where对象语句没有任何作用
感谢您的帮助。Where Object脚本块应计算为布尔值(或可以强制为布尔值的内容)。您只提供了一个字符串,如果该字符串不是空的,PowerShell将强制为布尔值$true。请尝试以下方法:
$strFilter = @()
while (...) { ...
$strFilter += "*$($filter[-1])*"
}
$filteredComputers = $computers |
Where {$dn=$_.DistinguishedName; @($strFilter | Where {$dn -like $_}).Count -eq 0}
这使用一个嵌套管道遍历每个过滤项,并将其应用于当前对象的DiscrimitedName—我们必须将其隐藏起来,因为在嵌套管道中,$\uu
接受当前$strFilter数组元素的值。如果其中任何一个通过了like
测试,则计数将大于零,并且不会通过管道。只有那些与任何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
Where Object
脚本块应计算为布尔值(或可以强制为布尔值的内容)。您只提供了一个字符串,如果该字符串不是空的,PowerShell将强制为布尔值$true。请尝试以下方法:
$strFilter = @()
while (...) { ...
$strFilter += "*$($filter[-1])*"
}
$filteredComputers = $computers |
Where {$dn=$_.DistinguishedName; @($strFilter | Where {$dn -like $_}).Count -eq 0}
这使用一个嵌套管道遍历每个过滤项,并将其应用于当前对象的DiscrimitedName—我们必须将其隐藏起来,因为在嵌套管道中,$\uu
接受当前$strFilter数组元素的值。如果其中任何一个通过了like
测试,则计数将大于零,并且不会通过管道。只有那些与任何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
在运行此代码的时间点: $filteredComputers=$computers |其中对象{$strFilter} $strfilter的价值是多少
如果您回显$strfilter的值,请尝试在其位置手动输入该值,是否有效?如果是这样,则文字是正确的,但执行方法是错误的。在运行此代码时: $filteredComputers=$computers |其中对象{$strFilter} $strfilter的价值是多少
如果您回显$strfilter的值,请尝试在其位置手动输入该值,是否有效?如果是这样,则文字是正确的,但执行方法是错误的。例如,我们只需要从用户文件夹中获取文件夹文档或“我的文档”:
[scriptblock]$filterBlock = { $_.Name -like '*ocum*' }
dir | ?{ & $filterBlock }
答案由两部分组成:
1) 将字符串强制转换为[ScriptBlock]
2) 使用&字符调用字符串(即脚本块)例如,我们只需要从用户文件夹中获取文件夹文档或“我的文档”:
[scriptblock]$filterBlock = { $_.Name -like '*ocum*' }
dir | ?{ & $filterBlock }
答案由两部分组成:
1) 将字符串强制转换为[ScriptBlock]
2) 使用&字符调用字符串(即脚本块)调用
($strFilter |其中{$dn-like$})。Count-eq 0
似乎将所有内容都标记为false,例如,“域控制器”的输入字符串仍将返回false,即使它不属于任何域控制器OU。这不应该是真的吗,因为有0个匹配?也许我误解了什么?这意味着它正在查找与$strFilter
中的一个过滤项的匹配项。$strFilter
的内容是什么?也许你有一个不应该出现的过滤项-也许是***
?我不相信***
是匹配的,如果你在将实例收集到数组中的第一个while循环中按enter键,那么会出现***
,在尝试筛选结果之前,我通常会对此进行检查。当我复制粘贴上面的示例时,不会返回foo。最后一个示例适用于V3,但不适用于V2。我更新了示例,以便它们可以同时在V2和V3上工作。另外,您能否在while循环之后立即转储$strFilter
的内容?因此,我运行while循环,并在提示时输入类似于域控制器的内容,然后输入end
以完成while循环。调用$strFilter返回:*域控制器*
,因为这行代码是$strFilter+=“*$($filter[-1])*”
。希望这有助于($strFilter | Where{$dn-like${})。Count-eq 0
似乎将所有内容都标记为false,例如,“域控制器”的输入字符串仍将返回false,即使它不属于任何域控制器OU。这不应该是真的吗,因为有0个匹配?也许我误解了什么?这意味着它正在查找与$strFilter
中的一个过滤项的匹配项。$strFilter
的内容是什么?也许你有一个不应该出现的过滤项-也许是***
?我不相信***
是匹配的,如果你在将实例收集到数组中的第一个while循环中按enter键,那么会出现***
,在尝试筛选结果之前,我通常会对此进行检查。当我复制粘贴上面的示例时,不会返回foo。最后一个示例适用于V3,但不适用于V2。我更新了示例,以便它们可以同时在V2和V3上工作。还有,你能把里面的东西倒出来吗