如何:指数=最后指数+6

时间:2014-06-13 22:08:51

标签: powershell powershell-v2.0 powershell-v3.0

我设计了一个脚本来放置与特定字符串匹配的数据。文本文件中有数十万个计算机名称。现在我有了所有的数据,我需要通过这个列表,并以某种方式设置一些像Idex = LastIndex + 6的东西。如果两行等于六,我想导出计算机名称并将它们放在两行中的两个不同的csv / excel文件中。如果两个数字之间的差异不是6,则忽略它。

以下是我现在收集信息的代码。我只是不知道如何计算。

$Servers = Get-Content c:\temp\dad\servers.txt

foreach ($Server in $servers)
{


    Get-ChildItem -Path \\$server\image_store$\Win764\DADLOGS -recurse -Filter ADReport.ini | Get-Content | Select-String -CaseSensitive -pattern "\bName=\b" |
    Export-Csv c:\scripts\test.csv -Force -Append -NoTypeInformation
    $intRow = $intRow + 1
}

以下是我得到的结果:有些人的计数为6,直到文件中的下一个数字,但其他人不会。

110名称= 042LOAN-TPL-Y

161名称= 052SHARE-TPL-K

212名称= 052SHARE-TPL-ZZ

258姓名= NYCMTENTESTING

38559姓名= gert34t-TPD-Z

38604姓名= njytyety-XPU

38610姓名= jnrthe-TPL-AD

38655姓名= dger54-XPU

38661姓名= ertydffj-TPL-AE

38706姓名= 5erteefg-XPU

38712姓名= nfhjtre-TPL-AG

2 个答案:

答案 0 :(得分:2)

如果我正确理解了这个问题,我认为这可能至少是解决方案的一部分:

$Data = 
(@'
110 Name=042LOAN-TPL-Y
161 Name=052SHARE-TPL-K
212 Name=052SHARE-TPL-ZZ
258 Name=NYCMTENTESTING
38559 Name=gert34t-TPD-Z
38604 Name=njytyety-XPU
38610 Name=jnrthe-TPL-AD
38655 Name=dger54-XPU
38661 Name=ertydffj-TPL-AE
38706 Name=5erteefg-XPU
38712 Name=nfhjtre-TPL-AG
'@).split("`n") |
foreach {$_.trim()}

$Last = '0'

$Keep = 
$Data | 
 foreach {

   if ( 6 -eq $_.split()[0] - $last.split()[0]  )
     { 
       ,($Last.split()[1],$_.split()[1] -replace 'Name=')
       $last ='0'
     }

    else { $last = $_ }
  }

$ keep将是一个数组数组,每个二级数组中有两个计算机名。

相同的基本思想,适用于导入/导出csv(未测试):

$InputFile = 'c:\somedir\somefile.csv'
$OutputFile = 'c:\somedir\clean.csv'

$NullRecord =  '' | Select Index,ComputerName 
$Last = $NullRecord.psobject.copy()

Import-Csv $InputFile |

 foreach {

   if ( 6 -eq $_.Index - $last.Index  )
     { 
       New-Object PSObject -Property @{
            OldMachine = $Last.ComputerName -replace 'Name='
            NewMachine = $_.ComputerName -replace 'Name='
           }

       $Last = $NullRecord.psobject.copy()
     }

    else { $Last = $_.psobject.copy() }

 } | Export-Csv $OutputFile -NoTypeInformation

答案 1 :(得分:0)

我认为这会做你所要求的,但它可能无法给你最好的表现。

$Servers = Get-Content c:\temp\dad\servers.txt

$indexes = @()
$matches = @()

$Servers | % {
    $currentIndex = $_.Split(" ")[0]
    if ($currentIndex-6 -in $indexes) {
        $matches += $currentIndex-6
        $matches += $currentIndex
        }
    $indexes += $currentIndex
    }

"`"Index`", `"Name`"" | Out-File c:\scripts\test.csv -Force
$Servers | % {
    $currentIndex = $_.Split(" ")[0]
    if ($currentIndex -in $matches) {
        "$currentIndex, `"$name`"" | Out-File c:\scripts\test.csv -Force -Append
        }
    }

这假设您要同时记录旧计算机和新计算机,但您可以通过删除$matches += ...行之一来轻松修改它。