Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables Powershell-使用变量替换代码块_Variables_Powershell_Active Directory - Fatal编程技术网

Variables 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

我有一个关于语句中的代码块和变量的简单问题。我的脚本收集用户输入并创建一个字符串,该字符串可在以后的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)
基本上,用户将输入任意多的单词,这些单词将被附加到字符串
“$”中。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上工作。还有,你能把里面的东西倒出来吗