Строки PowerShell ForEach-Object в текстовом файле. Сравнение и удаление в режиме разделения. - PullRequest
0 голосов
/ 01 января 2019

Я работаю над сценарием Powershell, который может помещать строки из текстового файла в список, но только строки, начинающиеся с даты ../../.... Работает часть списка добавления.Но id хотел бы сначала удалить более старые строки из текстового файла.Я пробовал это, но это не правильно.Может ли кто-нибудь помочь мне правильно написать код.

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

Текстовый файл выглядит так:

text.txt

//Regular Roster | Only update if making a permanent change.
!The order for the entry must be: Day time,number,name,email(optional)
!With a comma ‘,’ separating the values.

Monday 9AM-2PM,0400499449,BILL
Monday 2PM-6PM,074477464,Terry
Monday 6PM-9PM,040484747,Leanne

Tuesday 9AM-2PM,07123456,BILL
Tuesday 2PM-6PM,054647383,Barbara
Tuesday 6PM-9PM,03937464,Mandy

//Changes to Regular Roster. This section will override the above.
!The date order of the entries below is not important but each line must follow this pattern:
!date(Dayxx/Monthxx/Yearxxxx),time(9AM,2PM or 6PM),number,name,email(optional)
!Date slash must be forward facing '/'.
!The only times that can be entered are 9AM,2PM or 6PM.
!With a comma ‘,’ separating the values.

01/01/2019,6AM,0400012345,Kurt,kurt@outlook.com
02/01/2019,6AM,0412345676,Bill,bill@outlook.com
03/01/2019,6AM,0400012345,Sam,Sam@outlook.com
04/01/2019,6AM,0412345676,Barry,barry@outlook.com
05/01/2019,6AM,0400012345,Kurt,kurt@outlook.com

Если я попробую этот код в Powershell, предполагая, что текущая дата - 04/01/2019 (4 января 2019 г.), он отлично работает

$CurrentDate = "04/01/2019"
$Text = "05/01/2019,6AM,0400012345,Kurt,kurt@outlook.com"
$Text | ForEach-Object {
    $Roster1Date,$Roster2Time,$Roster3Number,$Roster4Name,$Roster5Email = $_.split(",")
    $Newdate = "$Roster1Date"
    $CurrentDate = [datetime]::ParseExact("$CurrentDate", 'dd/MM/yyyy', $null)
    $Newdate = [datetime]::ParseExact("$Newdate", 'dd/MM/yyyy', $null)
    if ($Newdate -ge $CurrentDate) {
     write-output "NewDate is bigger than or equal to"
    }
    else {
      write-output "CurrentDate is bigger"
    }
};

Когда я пытаюсь построить Listbox с этой строкойон отлично работает

#Add Listbox
$ShiftsListBox = New-Object System.Windows.Forms.ListBox
$ShiftsListBox.Location = New-Object System.Drawing.Size(400,40)
$ShiftsListBox.Size = New-Object System.Drawing.Size(360,20)
$ShiftsListBox.Height = 160
Get-Content $RosterPath | select-string -Pattern '../../...' | ForEach-Object {[void] $ShiftsListBox.Items.Add($_)};
$FormCreateNewShift.Controls.Add($ShiftsListBox)

Когда я попытался объединить два, он просто появляется пустым

#Add Listbox
$TextFile = text.txt
$ShiftsListBox = New-Object System.Windows.Forms.ListBox
$ShiftsListBox.Location = New-Object System.Drawing.Size(400,40)
$ShiftsListBox.Size = New-Object System.Drawing.Size(360,20)
$ShiftsListBox.Height = 160
Get-Content $TextFile | select-string -Pattern '../../...' | ForEach-Object {
    $Roster1Date,$Roster2Time,$Roster3Number,$Roster4Name,$Roster5Email = $_.split(",")
    $Newdate = "$Roster1Date"
    $CurrentDate = [datetime]::ParseExact("$CurrentDate", 'dd/MM/yyyy', $null)
    $Newdate = [datetime]::ParseExact("$Newdate", 'dd/MM/yyyy', $null)
    if ($Newdate -ge $CurrentDate) {
     [void] $ShiftsListBox.Items.Add($_)
    }
    else {
    }
};
$FormCreateNewShift.Controls.Add($ShiftsListBox)

Идея состоит в том, что если дата больше или равна отображению текущей датыстрока в списке, иначе нет.Но тогда я попытаюсь удалить строку, добавив в строке замены.

#Add Listbox
$TextFile = text.txt
$ShiftsListBox = New-Object System.Windows.Forms.ListBox
$ShiftsListBox.Location = New-Object System.Drawing.Size(400,40)
$ShiftsListBox.Size = New-Object System.Drawing.Size(360,20)
$ShiftsListBox.Height = 160
Get-Content $TextFile | select-string -Pattern '../../...' | ForEach-Object {
    $Roster1Date,$Roster2Time,$Roster3Number,$Roster4Name,$Roster5Email = $_.split(",")
    $Newdate = "$Roster1Date"
    $CurrentDate = [datetime]::ParseExact("$CurrentDate", 'dd/MM/yyyy', $null)
    $Newdate = [datetime]::ParseExact("$Newdate", 'dd/MM/yyyy', $null)
    if ($Newdate -ge $CurrentDate) {
     [void] $ShiftsListBox.Items.Add($_)
    }
    else {
          ((Get-Content -path $TextFile) -replace $_,"") | Set-Content -Path $TextFile;
    }
};
$FormCreateNewShift.Controls.Add($ShiftsListBox)

1 Ответ

0 голосов
/ 01 января 2019

На основе нового файла примера этот скрипт различает

  • между строками с начальной датой
    • с сегодняшней или более поздней даты (сохранить)
    • с датойдо сегодняшнего дня (пропустить)
  • другие строки (сохранить)

## Q:\Test\2019\01\01\SO_53992011.ps1
$Rosterpath = ".\rosterpath"

$CurrentDate = (Get-Date).Date  # to have a datetime starting today at 00:00:00

$RegEx = [RegEx]"^(?<day>\d{2})\/(?<mon>\d{2})\/(?<year>\d{4})"

$UpdatedContent = Get-Content $RosterPath | ForEach-Object {
    If ($_ -match $RegEx){
        If((Get-Date -Year $Matches.year -Month $Matches.mon -Day $Matches.day) -ge $CurrentDate){
            # yes keep this line
            $_
        } else { 
            #drop this line
        }
    } else {
        # line without a date, keep
        $_
    }
}

$UpdatedContent | Set-Content $RosterPath
...