我需要在导出到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
}
答案 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
不应等于A
,B
或C
。应用您的逻辑,表达式在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