Сравните CreationTime и пользовательский ввод - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь заставить программу найти все файлы, созданные в определенный день.Как сделать так, чтобы ввод от пользователя выполнялся в одном и том же формате, чтобы можно было сравнить оба?

Спасибо за помощь.

$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" 

    }

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Графический инструмент выбора даты не требует, чтобы пользователь вводил специальный формат,
здесь довольно сжатый календарь с годами и неделями и днями недели.

## 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" 
}

Имена месяцев, первая неделя, перваядень недели зависит от локали / пользовательских настроек.

enter image description here

0 голосов
/ 12 декабря 2018

Это будет ответ:

[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}
0 голосов
/ 07 декабря 2018

Дата Форматы не связаны с вашей проблемой : до тех пор, пока [DateTime]::Parse($fecha) преобразует входные данные пользователя в экземпляр [datetime], арифметика даты и времени .NET будет работатькак и ожидалось (и предоставление GUI-метода для пользователя, чтобы выбрать дату, может быть полезно, но аналогично непредвиденной проблеме).

Реальная проблема заключается в том, что *Time* свойства в [System.IO.FileInfo] и [System.IO.DirectoryInfo] экземплярах, выводимых Get-ChildItem, являются конкретные моменты времени , то есть они отражают дату, а также время дня , поэтому с использованием -eq для сравнения их с отметками календарного дня отметками времени , так как что-то вроде [datetime]::Parse('2018-12-31') вернет [1] , будет не работать должным образом .

Для доступа только к части date (самому start календарного дня) экземпляра [datetime], используйте свойство .Date:

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

Обратите внимание, что поскольку требуется вложенный доступ к свойству, scДля выражения необходимо использовать блок ript .


Конечно, предпочтительно предварительно проанализировать ввод пользователя как строку , чтобы увидеть, представляет ли она действительную дату: убедитесь, что $refDate = [DateTime]::Parse($fecha) не выдает исключение;если это так, повторите запрос.


[1] Обратите внимание, что [datetime]::Parse('<date-string>') использует культуру current для анализа строки, тогда как [datetime] '<date-string>' будет использовать инвариант культура.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...