PowerShell中的字符串匹配

时间:2017-02-08 09:40:45

标签: powershell

我是脚本新手,我想请求您提供以下帮助:

此脚本应为计划任务,与Veritas NetBackup配合使用,并以CSV格式创建备份注册表。

我正在生成两个源文件(.csv逗号分隔):

  • 一个文件包含:JobID,FinishDate,Policy等......
  • 第二个文件包含:JobID,TapeID

在第二个文件中可能存在多个具有不同TapeID-s的相同JobID。

我想达到这个目标,源文件1中每一行的脚本应检查所有源文件2,如果有JobID匹配,如果是,则应该有以下输出:

JobID,FinishDate,Policy,etc...,TapeID,TapeID....

我尝试过以下逻辑,但有时候我没有TapeID,或者我有两个相同的TapeID:

源文件1的内容位于$ BackupStatus

源文件2的内容在$ TapesUsed

$FinalReport =
foreach ($FinalPart1 in $BackupStatus) {
    write-output $FinalPart1
    $MediaID =
    foreach ($line in $TapesUsed){
        write-output $line.split(",")[1] | where-object{$line.split(",")[0] -like $FinalPart1.split(",")[0]}
    }
    write-output $MediaID
}

1 个答案:

答案 0 :(得分:1)

如果CSV文件不是很大,则更容易使用Import-Csv而不是手动拆分文件:

$BackupStatus = Import-Csv "Sourcefile1.csv"
$TapesUsed = Import-Csv "Sourcefile2.csv"

这将为每个文件生成一个对象列表。然后,您可以非常轻松地比较这些列表:

Foreach ($Entry in $BackupStatus) {
    $Match = $TapesUsed | Where {$_.JobID -eq $Entry.JobID}
    if ($Match) {
        $Output = New-Object -TypeName PSCustomObject -Property @{"JobID" = $Entry.JobID ; [...] ; "TapeID" = $Match.TapeID # replace [...] with the properties you want to use
        Export-Csv -InputObject $Output -Path <OUTPUTFILE.CSV> -Append -NoTypeInformation        }

}

这是一个相对冗长的变体,但我更喜欢这样。 我正在检查第一个文件中的每个条目是否在第二个文件中有匹配的条目。如果有的话,我将第一个列表的条目中的必填字段与第二个列表中的条目中的字段组合成一个对象,然后我可以使用Export-Csv非常舒适地导出。