0

我正在使用一个结构为:帐户名→年份→文件的目录。

在按年份和名称的每组文件中,通常有一个或多个文件包含"*Data Rec*"在文件名中。我只想为每组文件获取具有该名称的最新文件。现在我有下面的代码可以工作,但即使有一个 2012、2013 和 2014 的文件夹,每个文件夹至少包含一个文件,也只返回一个"*Data Rec*"文件。它也不保留目录结构。它只会将文件放入目的地。该文件来自 2014 文件夹,因此我希望我的目的地包含 2014 文件夹,其中包含该"*Data Rec*"文件。

Get-ChildItem -Path $path -Recurse -Filter "*Data Rec*" |
  Sort-Object LastAccessTime -Descending |
  Select-Object -First 1 |
  % { Copy-Item -Path $_.FullName -Destination $destination }

"*Analysis*"最终,如果所选文件夹不包含文件,我还希望能够搜索最新"*Data Rec*"文件。

4

2 回答 2

1

使用两个Get-ChildItem语句,一个枚举文件夹,另一个枚举每个文件夹中的文件。

Get-ChildItem -Path $path -Recurse -Directory | ForEach-Object {
  Get-ChildItem -File -Filter "*Data Rec*" |
    Sort-Object LastAccessTime -Descending |
    Select-Object -First 1 |
    Copy-Item -Destination $destination
}

如果您不使用 PowerShell v3 或更新版本,则需要替换参数-Directory-File使用Where-Object过滤器检查对象的PSIsContainer属性。

要保留文件夹结构,您需要$path从要复制的文件的完整路径中删除并将其附加到目标路径。

{ Join-Path $destination ($_.FullName.Replace("$path\", '')) }
于 2016-02-24T02:51:38.827 回答
0

我知道这是一个死灵帖子,但是 Ansgar 上面发布的解决方案对我来说并不完全有效。我不得不对其进行调整以使其正常工作。不确定我是否应该将其作为新答案或作为对他的答案的评论发布,所以如果我做错了,请告诉我,以及如何解决它!

这是我最终使用的代码。它获取每个子目录中的最新文件,并将其复制到目标。如果目标目录不存在,它也会首先创建它。我不确定如何使脚本与多行一起工作,所以它看起来有点难看 - 抱歉!最后,在原始示例中,此人正在搜索与我不同的词(我搜索“*bak”) - 只需将搜索词替换为正在搜索的内容。

Get-ChildItem -Path $Path -Directory | ForEach-Object {Get-ChildItem -Path "$Path\$_" -File -Filter "*bak" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 | Copy-Item -Force -Destination (New-Item -Force -Type Directory -Path (Join-Path $DestinationPath ($_.FullName.Replace("$Path\", ''))))}

在一个完美的世界中,如果文件已经存在,脚本不会复制它。这是可行的,只需删除 -Force,但如果我这样做,它会吐出丑陋的错误消息。不过,也许这比覆盖要好。但是,奇怪的是,如果目标文件名存在,则 Copy-Item 不允许显式不复制的选项。

于 2018-08-31T17:22:52.033 回答