Как обеспечить, чтобы последние два файла были скопированы с совпадающими датами с помощью powershell? - PullRequest
0 голосов
/ 26 июня 2019

Я использую Powershell для копирования двух файлов на диск.Эти файлы создаются каждый день, однако иногда один файл обновляется, а другой - нет.Как мне убедиться, что последние файлы скопированы и даты совпадают.т. е. если файл A по состоянию на 26.6.19 и файл B по состоянию на 26.6.19, скопируйте эти два.Однако, если файл A по состоянию на 26.6.19, а файл b по состоянию на 25.6.19, то мне потребуется использовать файл A по состоянию на 25.6.19 и наоборот.

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

$ bak_path = "Путь к файлу" get-childitem -path $ bak_path -Filter "ФайлA * .csv_AABBCC "|

where-object { -not $_.PSIsContainer } | 

  Sort-Object $_.CreationTime |

select-object -last 1 | 


copy-item -Destination File Location

get-childitem -path $ bak_path -Filter "Файл B * .csv_AABBCC" |

where-object { -not $_.PSIsContainer } | 

  Sort-Object $_.CreationTime |

select-object -last 1 |    

copy-item -Destination File Location

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Get-ChildItem имеет параметр -File для вывода списка только файлов, поэтому вам не нужно использовать | where-object { -not $_.PSIsContainer }.

Вы хотите получить последнюю распространенную версию FileA и FileB, а затем скопировать их в $destination, вот код.

Обновленный код

$lastA = Get-ChildItem -Path $bak_path -File -Filter "File A*.csv_AABBCC" | Sort-Object -Property {$_.CreationTime.Day} -Descending | select -First 1
$lastB = Get-ChildItem -Path $bak_path -File -Filter "File B*.csv_AABBCC" | Sort-Object -Property {$_.CreationTime.Day} -Descending | select -First 1
$lowest = [math]::Min($lastA.CreationTime.Day, $lastB.CreationTime.Day)

Get-ChildItem -Path $bak_path -File -Filter "File A*.csv_AABBCC" | where-object {$_.Creationtime.day -eq $lowest -and $_.CreationTime.Month -eq $lastA.Creationtime.month} | copy-item -Destination $destination
Get-ChildItem -Path $bak_path -File -Filter "File B*.csv_AABBCC" | where-object {$_.Creationtime.day -eq $lowest -and $_.CreationTime.Month -eq $lastB.Creationtime.month} | copy-item -Destination $destination

1 - Я получаю время последнего создания как FileA, так и FileB.

2 - Получить наименьшую дату между ними (чтобы убедиться, что и FileA, и FileB имеют самую последнюю общую версию)

3- Скопируйте файлы в место назначения.

0 голосов
/ 26 июня 2019

РЕДАКТИРОВАТЬ в 11:00 по Гринвичу 28/06/2019

Хорошо, поэтому, основываясь на заметках нашего разговора, я попытался воспроизвести ваше окружение.

Get-ChildItem E:\test1 

Directory: E:\test1

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       27/06/2019     13:54          11170 PRM_cashExtract_20190627t10045.csv_ATF03305
-a----       27/06/2019     14:02          48682 PRM_cashExtract_20190627t10045.csv_ATF04251
-a----       27/06/2019     13:54          11170 PRM_cashExtract_20190628t10045.csv_ATF03305
-a----       27/06/2019     14:02          48682 PRM_cashExtract_20190628t10045.csv_ATF04251
-a----       27/06/2019     14:07          44582 PRM_posExtract_20190627t10045.csv_ATF04251
-a----       27/06/2019     14:07           1079 PRM_transExtract_20190627t10045.csv_ATF03305
-a----       27/06/2019     14:18        1587853 PRM_transExtract_20190627t10045.csv_ATF04251

Затем я выполнил эти команды, чтобы просто перейти к двум файлам, которые вам нужны, основываясь на соглашении об именах и дате создания в течение последних 24/47 часов

$date = ( Get-Date ).AddDays( -1 ).DayOfYear
$bak_path = Get-ChildItem FILEPATH | where { ( $_.Name -match "_ATF04251" ) -and ( $_.Name -notmatch "trans" ) } | Select Name, FullName, @{ n="CreationTime" ; e={ ( Get-Date $_.CreationTime ).DayOfYear } } | sort CreationTime

Это дало мне:

$bak_path
Name                                        FullName                                             CreationTime
----                                        --------                                             ------------
PRM_cashExtract_20190627t10045.csv_ATF04251 E:\test1\PRM_cashExtract_20190627t10045.csv_ATF04251          178
PRM_posExtract_20190627t10045.csv_ATF04251  E:\test1\PRM_posExtract_20190627t10045.csv_ATF04251           178
PRM_cashExtract_20190628t10045.csv_ATF04251 E:\test1\PRM_cashExtract_20190628t10045.csv_ATF04251          179

Итак, он взял три файла: два со вчерашнего дня и один с сегодняшнего дня.

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

$bak_path | Group-Object { $_.CreationTime } | where { ( $_.Count -ge 2 ) -and ( $_.Group.CreationTime -ge $date ) } | foreach { Copy-Item $_.Group.FullName -Destination DESTINATION }
...