【问题标题】:Delete rows based on multiple conditions in PowerShell在 PowerShell 中根据多个条件删除行
【发布时间】:2022-11-18 04:50:35
【问题描述】:
Street City Hour of Registration
hill st bolton 11/16/2022 10:00
flo st bolton 11/15/2022 10:10

如果 city=bolton AND Hour of Registration 小于或等于 <= 24 小时,则删除行

所以基本上,如果我对带有上述数据集的 xls 文件运行代码,则只应删除第 1 行(hill st)。基本上类似于当前时间 - 注册时间。

我下面的代码能够删除给定 1 个条件的行,但我不确定如何实现多个条件或时间

计数是自下而上的。自上而下似乎搞乱了计数并错过了一些行

$file  = 'salehouses.xls'
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
# open file
$workbook = $excel.Workbooks.Open($file)
$sheet    = $workbook.Worksheets.Item(1)
# get max rows
$rowMax   = $sheet.UsedRange.Rows.Count

for ($row = $rowMax; $row -ge 2; $row--) {
    $cell = $sheet.Cells[$row, 2].Value2
    if ($cell -ieq 'bolton') {
        $null = $sheet.Rows($row).EntireRow.Delete() }

$Filename = 'salehouses.xls'
$workbook.SaveAs("c:\xls\salehouses.xls")
$excel.Quit()


Bigger Data set to test against as of 11/17/2022 3:50 PM where everything <24hr should be deleted. 

Street  City    Hour Of Registeration   
hill st     Bolton  11/16/2022 12:28    >24hr
flow st Bolton  11/16/2022 13:39    >24hr
jane st Bolton  11/16/2022 15:00    >24hr
jack st     Bolton  11/16/2022 15:00    >24hr
Gone st Bolton  11/16/2022 18:16    <24hr
top st  Bolton  11/16/2022 18:27    <24hr
sale st     Bolton  11/16/2022 19:18    <24hr
jack st     Bolton  11/16/2022 20:14    <24hr
Gone st Bolton  11/16/2022 20:28    <24hr
top st  Bolton  11/17/2022 02:51    <24hr
sale st     Bolton  11/17/2022 03:02    <24hr
jack st     Bolton  11/17/2022 06:21    <24hr
Gone st Bolton  11/17/2022 08:51    <24hr


【问题讨论】:

    标签: powershell


    【解决方案1】:

    计算时差,大家可以自己尝试理解。

    [DateTime]$HourofReg = "11/16/2022 10:00" #To convert the string to DateTime
    $currentTime = Get-date
    $timeDiff = New-TimeSpan $HourofReg $currentTime # To find the time difference
    if ( $timeDiff.TotalHours -gt 24) {
    Write-Host "greater than 24 hours"
    }
    

    回答你的问题: 获取变量中的 hourofreg 单元格值并执行上述步骤。

    if ( ($cell -ieq 'bolton') -and ($timeDiff.TotalHours -gt 24 )) {
     # Do Something 
    }
    Hope this helps!
    

    【讨论】:

      【解决方案2】:

      这是一个可行的解决方案。

      $file  = 'salehouses.xlsx'
      $sourcePath = 'C:somepath'
      $sourceFile = $sourcePath + $file
      
      $excel = New-Object -ComObject Excel.Application
      $excel.Visible = $false
      # open file
      $workbook = $excel.Workbooks.Open($sourceFile)
      $sheet    = $workbook.Worksheets.Item(1)
      # get max rows
      $rowMax   = $sheet.UsedRange.Rows.Count
      
          for ($rowNumber=2; $rowNumber -le $rowMax; $rowNumber++){
          $city = $sheet.Cells($rowNumber,2).value2
          # check for blank or null value Get-Date well brake if it tries to convert a empty string. This will skip this section if the hour cell is blank
          if ($sheet.Cells($rowNumber,3).text -ne $null -and $sheet.Cells($rowNumber,3).text -ne ""){
              $regTime = get-date $sheet.Cells($rowNumber,3).text
              $currentTime = Get-Date
              $timeDifference = (NEW-TIMESPAN -Start $regTime -End $currentTime).Hours
              Write-Host "time difference (hours): " $timeDifference
      
              if ($city -eq "bolton" -and $timeDifference -le '24') {
                  Write-Host "delete"
                  $null = $sheet.Rows($rowNumber).EntireRow.Delete() 
      
              }
          }
      }
      
      
      
      
      
      
      
      $Filename = 'salehouses_modified.xlsx'
      $path = 'c:somepath'
      $fullPathModified =$path + $Filename
      $workbook.SaveAs($fullPathModified)
      $excel.Quit()
      

      Source 获取时差

      笔记

      在您的原始代码中,您有一个正确的想法,即获取使用的范围计数并循环遍历它,而不是读取标题。我将 for 循环更改为开始和 2(跳过标题)并向上计数而不是向下计数。我认为这种方式更清洁。您还能够比较一个单元格,您只需要在小时列中获取单元格。

      如果您想根据满足的多个条件做某事,请在 if 语句中使用 -and

      您可能会注意到的一个怪癖是,在获取日期单元格时,我必须使用 .text 而不是 .value2 ,就像其他单元格一样。我不确定为什么,但我认为这是因为 excel 将单元格格式化为日期,并且它在 .value2 中存储了不同的格式,而 .text 保留了我们想要的值。

      我建议像其他评论者建议的那样练习使用不同的条件语句和 Get-Date 命令,以便更熟悉上面代码中发生的事情。

      【讨论】:

      • 嘿感谢您的回答,但我收到此错误:Get-Date:无法绑定参数“日期”。无法将值“”转换为类型“System.DateTime”。错误:“字符串未被识别为有效的日期时间。”获取日期:无法绑定参数“日期”。无法将值“”转换为类型“System.DateTime”。错误:“字符串未被识别为有效的日期时间。”
      • @NebelzCheez 我在帖子中添加了一些解释。正在读取的其中一个单元格是空白的。这就是错误消息包含空引号“”的原因。我添加了一个 if 语句来检查它是否为空值。 if ($sheet.Cells($rowNumber,3).text -ne $null -and $sheet.Cells($rowNumber,3).text -ne "")
      • 嘿,脚本没有删除一些应该删除的行。这可能是因为您是从上往下数的。你可以尝试自下而上吗?有时它会删除不应删除的行。不确定这是否与 24 小时计时或从上到下计数有关。我添加了一些您可以测试的数据集。出于某种原因,>24 小时的行被删除 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2017-09-12
      • 2021-02-24
      相关资源
      最近更新 更多