【问题标题】:Compare CreationTime and user input比较 CreationTime 和用户输入
【发布时间】:2018-12-12 14:07:25
【问题描述】:

我试图让一个程序找到在某个日期创建的所有文件。如何使用户的输入具有相同的格式,以便可以比较两者?

感谢您的帮助。

$root= [Environment]::GetFolderPath("Desktop")
Write-Host "Programa de reenvío a unbilling." -fore white
$fecha = Read-Host -Prompt 'Colocar fecha que desea enviar. FORMATO DD/mm/YY. Ejemplo 31/12/2018 '
Get-ChildItem "$root\UNB\FINAL_TEXTO\" -Filter *.txt | Where-Object CreationTime -EQ ([DateTime]::Parse($fecha))

    Foreach-Object {
    $archivo= $_.Name
    Write-Host "Facturas encontrada: $archivo " -fore green
    #start-process -filepath "$root\UNB\FINAL_TEXTO\$archivo" -verb print | out-printer "UNBILLING" 

    }

【问题讨论】:

  • 正如所写,您的问题是您使用-eq 将具有时间组件的文件系统时间戳与仅日历日时间戳进行比较(no时间组件)。格式化仅在 [DateTime]::Parse() 是否可以识别用户输入方面发挥作用 - 为用户选择日期提供 GUI 助手是一个单独的问题。

标签: powershell


【解决方案1】:

图形日期选择器不需要用户输入特殊格式,
这是一个非常简洁的年历函数,带有周和工作日。

## Q:\Test\2018\12\07\SO_53661152.ps1
[void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
Function Pick-Date {
  $Cal = New-Object System.Windows.Forms.MonthCalendar
  $Cal.ShowWeekNumbers = $true
  $Cal.MaxSelectionCount = 1
  $Cal.Dock = 'Fill'
  $Form = New-Object Windows.Forms.Form
  $Form.text = "Colocar fecha que desea enviar. [enter]"
  $Form.Size = New-Object Drawing.Size @(656,620)
  $btnSelect = New-Object System.Windows.Forms.Button
  $btnSelect.Size = "100,100"
  $btnSelect.add_Click({ $Form.close() })
  $btnSelect.Location = New-Object System.Drawing.Point(530,480)
  $btnSelect.Text="ENTER"
  $Form.Controls.Add($btnSelect )
  $Form.AcceptButton = $btnSelect
  $Form.Controls.Add($Cal)
  $Form.Add_Shown({$Form.Activate()})
  [void]$Form.ShowDialog()
  return (Get-Date($Cal.SelectionStart))
}

$root= [Environment]::GetFolderPath("Desktop")
Write-Host "Programa de reenvío a unbilling." -fore white

$fecha = Pick-Date

Get-ChildItem "$root\UNB\FINAL_TEXTO\" -Filter *.txt | 
  Where-Object {$_.CreationTime.Date -EQ $fecha} | Foreach-Object {
    $archivo = $_.Name
    Write-Host "Facturas encontrada: $archivo " -fore green
    #start-process -filepath "$root\UNB\FINAL_TEXTO\$archivo" -verb print | out-printer "UNBILLING" 
}

月份名称、第一周、一周的第一天取决于区域设置/用户设置。

【讨论】:

  • 奇怪...我无法访问对象名称。如果我在代码 Get-ChildItem "$root\UNB\FINAL_TEXTO\" -Filter *.txt | 中使用 $archivo = $_.Name Where-Object {$_.CreationTime.Date -EQ $fecha | Foreach-Object { $archivo = $_.Name Write-Host "Facturas encontrada: $archivo " -fore green #start-process -filepath "$root\UNB\FINAL_TEXTO\$archivo" -verb print |打印机“取消计费”} }
  • 抱歉,Where-Object 中缺少一个结束 },上面已更改。
【解决方案2】:

日期格式与您的问题无关:只要[DateTime]::Parse($fecha) 成功将用户的输入转换为[datetime] 实例,.NET 的日期/时间算法将按预期工作(并且为用户选择日期提供 GUI 方法可能会有所帮助,但对于手头的问题同样是偶然的)。

真正的问题是[System.IO.FileInfo][System.IO.DirectoryInfo] 实例上Get-ChildItem 输出的*Time* 属性特定的时间点,这意味着它们反映日期和一天中的时间,因此使用-eq 将它们与calendar-day-only 时间戳进行比较,就像[datetime]::Parse('2018-12-31') 这样的东西会返回[1]按预期工作

要仅访问[datetime] 实例的日期 部分(日历日的开始),请使用.Date 属性:

Get-ChildItem "$root\UNB\FINAL_TEXTO" -Filter *.txt | 
  Where-Object { $_.CreationTime.Date -eq [DateTime]::Parse($fecha) }

请注意,由于需要嵌套属性访问,因此必须为表达式使用脚本块


当然,最好将用户输入解析为字符串事先,以查看它是否代表有效日期:确保$refDate = [DateTime]::Parse($fecha) 不会引发异常;如果是,请重新提示。


[1] 请注意,[datetime]::Parse('<date-string>') 使用 current 文化来解析字符串,而 [datetime] '<date-string>' 将使用 invariant 文化。` 支持>

【讨论】:

    【解决方案3】:

    这就是答案:

    [void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
    Function Pick-Date {
      $Cal = New-Object System.Windows.Forms.MonthCalendar
      $Cal.ShowWeekNumbers = $true
      $Cal.MaxSelectionCount = 1
      $Cal.Dock = 'Fill'
      $Form = New-Object Windows.Forms.Form
      $Form.text = "Colocar fecha que desea enviar. Y presiona Enter"
      $Form.Size = New-Object Drawing.Size @(656,620)
      $btnSelect = New-Object System.Windows.Forms.Button
      $btnSelect.Size = "100,100"
      $btnSelect.add_Click({ $Form.close() })
      $btnSelect.Location = New-Object System.Drawing.Point(530,480)
      $btnSelect.Text="ENTER"
      $Form.Controls.Add($btnSelect )
      $Form.AcceptButton = $btnSelect
      $Form.Controls.Add($Cal)
      $Form.Add_Shown({$Form.Activate()})
      [void]$Form.ShowDialog()
      return (Get-Date($Cal.SelectionStart))
    }
    
    $fecha = Pick-Date
    
    $archivos=Get-ChildItem "$root\UNB\FINAL_TEXTO\" -Filter *.txt | Where-Object {$_.CreationTime.Date -EQ $fecha}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-30
      • 2018-04-25
      • 1970-01-01
      • 2016-08-09
      • 2015-07-02
      • 2020-02-13
      • 2021-08-22
      相关资源
      最近更新 更多