2016-02-23 2 views
0

Я работаю с каталогом со структурой как: имя учетной записи → year →.Как скопировать только самый последний файл из каждой папки и вложенной папки при сохранении структуры каталогов?

В каждой группе файлов по году и имени обычно есть один или несколько файлов, содержащих "*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*" файл.

+0

Лично я хотел бы использовать PS, чтобы получить желаемый исходный путь и путь назначения, а затем выполнить RoboCopy или что-то, чтобы выполнить фактическую копию файла, так как это будет только перезаписать файлы, когда они обновляются, и он будет поддерживать каталог структуры и всего этого. – TheMadTechnician

+0

@ TheMadTechnician Есть ли способ интегрировать параметры Get-ChildItem с robocopy? Я не могу найти способ использовать robocopy для получения только самого последнего файла из каждой папки с помощью этого критерия фильтра. – Cole

+0

Crud, я сказал RoboCopy? Я имею в виду [RichCopy] (https://technet.microsoft.com/en-us/magazine/2009.04.utilityspotlight.aspx). Несколько лет назад проект любителя от сотрудника Microsoft, который копирует файлы. Это похоже на RoboCopy, но более потрясающее. – TheMadTechnician

ответ

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\", '')) } 
+0

Спасибо за ваш ответ. Я не работаю с PowerShell v3, и у меня возникают проблемы с заменой параметров -Directory и -File. Я понимаю, что для -Directory я хочу заменить его «Where-Object {$ _. PSIsContainer}», но я не уверен, как заменить -File. – Cole

+0

@Cole Просто, чтобы быть понятным, «заменив параметры», я не хотел буквально заменить их на месте, но удалить их и добавить в конвейер фильтр «Where-Object». Что касается сопоставления файлов, вместо того, чтобы сопоставлять вещи, которые являются контейнерами (например, каталоги), вам просто нужно сопоставить вещи, которые являются * не * контейнерами. –

Смежные вопросы