我有一个带有四个标题的CSV文件,最重要的是IP地址。我需要做的是搜索文件某个文件目录及其所有子文件和目录,以查看IP地址是否未包含在任何文件中。如果IP地址未包含在任何文件中,请将IP地址添加到阵列,然后继续检查所有IP地址。完成后,列出数组的内容。
$Path = "C:\Users\Me\Desktop\nagios\configs\hosts"
$NotMonitoredArray = @()
$servers = Import-Csv "C:\wpg-export.csv"
foreach ($item in $servers) {
Get-ChildItem $Path -Recurse | Where-Object {
$_.Attributes -ne "Directory"
} | ForEach-Object {
if (Get-Content | Where-Object { !(Select-String -Pattern $_.IPAddress -Quiet) }) {
$NotMonitoredArray += $_.IPAddress
}
}
}
它被卡在Get-Content
cmdlet专门说
命令管道位置1的cmdlet Get-Content 供给以下参数的值:
路径[0]
答案 0 :(得分:2)
Get-Content
有一个您没有指定的必填参数-Path
。这是导致您观察到的错误的原因。但是,由于Select-String
可以自行阅读文件,因此您首先不需要Get-Content
。此外,您明确希望避免多次从整个目录树中读取文件。而是从CSV中的IP地址创建正则表达式:
$csv = Import-Csv 'C:\wpg-export.csv'
$pattern = ($csv | ForEach-Object {
'({0})' -f [regex]::Escape($_.IPAddress)
}) -join '|'
使用该模式在一次运行中查找文件中存在的唯一IP地址:
$foundIP = Get-ChildItem $Path -Recurse |
Where-Object { -not $_.PSIsContainer } |
Select-String -Pattern $pattern |
Select-Object -Expand Matches |
Select-Object -Expand Value -Unique
然后使用结果列表过滤CSV:
$NotMonitoredArray = $csv | Where-Object { $foundIP -notcontains $_.IPAddress } |
Select-Object -Expand IPAddress