我的脚本在检查多个参数的同时在O(n)时间内运行;如果可能的话,我正在寻找一种接近O(1)时间的方法。请忽略我使用excel的事实;脚本的其他部分正在使用这些方法。所有建议都表示赞赏。
$rowMax = ($sheet.UsedRange.Rows).count
$count = 0
$countDelete = 0
#Declare the starting positions
$rowCompName,$colCompName = 1,3
#Checking Loop
for ($i=1; $i -le $rowMax-1; $i++){
$CompName = $sheet.Cells.Item($rowCompName+$i,$colCompName).text.ToUpper()
#Items Processed
$count++
#Removal of non-ND machines
if($CompName -eq ''){
continue
}
$CompName = $CompName.Substring(0,5)
if($CompName -ne "Name1" -and $CompName -ne "Name2" -and $CompName -ne "Name3" -and $CompName -ne "Name4") {
$returnsTrue = $sheet.Cells.Item($rowCompName+$i,$colCompName).EntireRow.Delete()
$rowsDeleted++
$i--
$rowMax--
$countDelete++
}
}
答案 0 :(得分:0)
我可以看到一些让你放慢速度的事情。至少对comobject进行多次调用会降低你的速度。您可以进行RegEx匹配或使用-in
运算符,只需检查名称是否在名称列表中。还有使用Switch
命令和制作案例的选项,但我不确定能为你加速的程度。快速查看会告诉我试试这个:
$InitialRows = $Sheet.UsedRange.Rows.Count
$Excludes = 'NAME1','NAME2','NAME3','NAME4',$null
$Sheet.UsedRange.Rows | Where{$_.Cells.Item(3).Value2.ToUpper().Substring(0,5) -notin $Excludes} | ForEach{$_.EntireRow.Delete() | Out-Null}
$RowsDeleted = $InitialRows - $Sheet.UsedRange.Rows.Count
这将保留第三个单元格中没有任何内容的任何行,或者匹配您指定的4个名称。
如果您正在使用具有Get-Clipboard
cmdlet的较新版本的PowerShell,则可以抓取字符串,并快速生成一组对象以使用PowerShell中的数据,然后清除工作表并粘贴返回结果。我将在这里使用RegEx匹配而不是-in
运算符。
$Excludes = 'NAME1','NAME2','NAME3','NAME4'
$RegEx = ($Excludes | %{[regex]::escape($_)}) -join '|'
$sheet.UsedRange.Copy() | Out-Null
$dataImport = Get-Clipboard | ConvertFrom-Csv -Delimiter "`t"
$Sheet.UsedRange.Clear() | Out-Null
$dataImport.Where({[string]::IsNullOrEmpty($_.ServerName) -or $_.ServerName.Substring(0,5) -match "^$RegEx"}) | ConvertTo-Csv -Del "`t" -NoType | Clip
$Sheet.Cells.Item(1).PasteSpecial() | Out-Null
这应该和第一个做同样的事情,虽然我没有做任何事情来计算行数,但是所有数据仍然在PowerShell中,你可以计算行数或做任何你想要的处理。至于Switch
命令,我认为这不是一个很好的选择,但如果你想要一个例子,我可以很容易地写一个。