我设计了一个脚本来放置与特定字符串匹配的数据。文本文件中有数十万个计算机名称。现在我有了所有的数据,我需要通过这个列表,并以某种方式设置一些像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
答案 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 += ...
行之一来轻松修改它。