0

アカウント名→年→ファイルという構造のディレクトリで作業しています。

年と名前によるファイルの各グループ内には、通常、ファイル名に含まれる 1 つ以上のファイルが"*Data Rec*"あります。ファイルのグループごとに、その名前の最新のファイルのみを取得したいと思います。現在、動作する以下のコードがありますが、少なくとも 1 つのファイルを含む 2012、2013、および 2014 のフォルダーがあるにもかかわらず、1 つのファイルしか返されません"*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

2 つのGet-ChildItemステートメントを使用します。1 つはフォルダーを列挙し、もう 1 つは各フォルダー内のファイルを列挙します。

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があります-FileWhere-ObjectPSIsContainer

フォルダー構造を保持するに$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 に答える