从管道导出之前过滤几台计算机

时间:2016-01-15 20:17:27

标签: powershell active-directory

我需要在导出到csv文件之前过滤掉4台机器。我不知道如何过滤掉它们。我尝试了IF子句,但这没有产生任何结果。请帮忙。

$old = (Get-Date).AddDays(-90) # Modify the -90 to match your threshold 
$oldComputers = Get-ADComputer -SearchBase "OU=Workstations,DC=Corporate,DC=Local" -SearchScope 2 -Filter { PasswordLastSet -le $old } -Properties *
$oldComputers

if ($_.name -notlike "1919DD" -or $_.name -notlike "1919SMAHESHWARE" -or $_.name -notlike "1919IETEST" -or $_.name -notlike "1920BPASCERITB") {
    Export-Csv c:\temp\Over90DaysMachines.csv -NoTypeInformation -Force -Append
}

3 个答案:

答案 0 :(得分:1)

我猜测OP中的代码是来自更大脚本的片段。据推测,它是ForEach-Object的身体或身体的一部分。 (如果没有,那么$_在这种情况下没有意义)。但是ForEach-Object不是必需的。您可以按如下方式过滤掉不需要的计算机:

$old = (Get-Date).AddDays(-90) # Modify the -90 to match your threshold 
$oldComputers = Get-ADComputer -SearchBase "OU=Workstations,DC=Corporate,DC=Local" -SearchScope 2 -Filter { PasswordLastSet -le $old } -Properties *
$oldComputers | Where-Object {
    $_.name -notin "1919SMAHESHWARE","1919IETEST", "1920BPASCERITB"
} | Export-Csv c:\temp\Over90DaysMachines.csv -NoTypeInformation -Force -Append

这假定$oldComputers是一个对象数组,其中每个对象都有一个属性name,而name的值是一个字符串,如" server1",& #34; server2"等.OP中的脚本输出$oldComputers,因此验证它看起来像一组对象,name属性由一个字符串组成,其中要排除的服务器是拼写完全与OP中列出的一样。

答案 1 :(得分:1)

首先,为了能够使用当前对象变量($_),您需要一个管道上下文。简单地在回显变量后添加if语句并不会自动将回显的值提供给if语句。你需要改变这个:

$oldComputers

if ($_.Name -notlike "1919DD" -or ...) {
    Export-Csv c:\temp\Over90DaysMachines.csv -NoTypeInformation -Force -Append
}

这样的事情:

$oldComputers | Where-Object {
    $_.Name -notlike "1919DD" -or ...
} | Export-Csv c:\temp\Over90DaysMachines.csv -NoType -Force

但是,即使进行了这项更改,您的过滤器也无法正常运行,因为您应该使用-notlike时通过-or关联-and子句。显然,只有在对象的名称与任何给定值都不匹配时才会处理对象。但是,要使您的逻辑表达式评估为$false,该名称必须同时匹配所有的参考值 。这显然是不可能的,因此您的表达总是评估为$true

示例:

假设您的变量$v不应等于ABC。应用您的逻辑,表达式在PowerShell中看起来有点像这样:

($v -notlike 'A') -or ($v -notlike 'B') -or ($v -notlike 'C')

如果$v占用了表达式变为

的值A
  ('A' -notlike 'A') -or ('A' -notlike 'B') -or ('A' -notlike 'C')
⇔ ($false) -or ($true) -or ($true)
⇔ $true

要检查给定值是否等于您通过-and连接子句所需的参考值:

  ('A' -notlike 'A') -and ('A' -notlike 'B') -and ('A' -notlike 'C')
⇔ ($false) -and ($true) -and ($true)
⇔ $false
$oldComputers | Where-Object {
    $_.Name -notlike "1919DD" -and
    $_.Name -notlike "1919SMAHESHWARE" -and
    $_.Name -notlike "1919IETEST" -and
    $_.Name -notlike "1920BPASCERITB"
} | Export-Csv c:\temp\Over90DaysMachines.csv -NoType -Force

请注意,当参考字符串不包含通配符时,-notlike运算符的行为与-ne运算符完全相同。如果你还没有进行模糊匹配,你可以通过检查名称数组中是否找到给定名称而不是对(in)相等进行多次检查来简化表达式:

$excludes = '1919DD', '1919SMAHESHWARE', '1919IETEST', '1920BPASCERITB'
$oldComputers | Where-Object {
    $excludes -notcontains $_.Name
} | Export-Csv c:\temp\Over90DaysMachines.csv -NoType -Force

另一种选择是正则表达式(非)匹配:

$oldComputers | Where-Object {
    $_.Name -notmatch '^1919DD|1919SMAHESHWARE|1919IETEST|1920BPASCERITB$'
} | Export-Csv c:\temp\Over90DaysMachines.csv -NoType -Force

答案 2 :(得分:0)

请尝试以下代码

$old = (Get-Date).AddDays(-90) # Modify the -90 to match your threshold 
$oldComputers = Get-ADComputer -searchbase "OU=Workstations,DC=Corporate,DC=Local" -SearchScope 2 -Filter { PasswordLastSet -le $old } -Properties * 

    $oldComputers = $oldComputers | where {$_.name -notlike "1919DD" 
    ` -or $_.name -notlike "1919SMAHESHWARE" 
    ` -or $_.name -notlike "1919IETEST" 
    ` -or $_.name -notlike "1920BPASCERITB"}

Export-Csv c:\temp\Over90DaysMachines.csv -NoTypeInformation -force -append