如何使用Powershell确保以匹配的日期复制最新的两个文件?

时间:2019-06-26 09:11:54

标签: excel powershell date matching

我正在使用Powershell将两个文件复制到驱动器中。这些文件每天都会创建,但是有时一个文件会更新,而另一个则不会。如何确保最新文件被复制且日期匹配。也就是说,如果文件A从26.6.19开始,文件B从26.6.19开始,请复制这两个文件。但是,如果文件A从26.6.19开始,而文件b从25.6.19开始,那么我将被要求使用从25.6.19开始的文件A,反之亦然。

我尝试使用创建日期,但这是我的问题所在,因为日期可能不同

$ bak_path =“文件路径” get-childitem -path $ bak_path-过滤“文件A * .csv_AABBCC” |

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

  Sort-Object $_.CreationTime |

select-object -last 1 | 


copy-item -Destination File Location

get-childitem -path $ bak_path-过滤器“文件B * .csv_AABBCC” |

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

  Sort-Object $_.CreationTime |

select-object -last 1 |    

copy-item -Destination File Location

2 个答案:

答案 0 :(得分:0)

格林尼治标准时间2019年6月28日上午11点进行编辑

基于对话的内容,我尝试复制您的环境。

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 }

答案 1 :(得分:0)

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-将文件复制到目标位置。