查询和列出文件目录中找不到的字符串

时间:2016-04-18 14:17:22

标签: powershell

我有一个带有四个标题的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]

1 个答案:

答案 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