Переместить файлы определенного размера в определенный каталог (и исключить определенные подкаталоги)

Фон

Недавно подписавшись на бокс-аккаунт на 50 ГБ, я решил загрузить коллекцию фотографий своего компьютера. Но большинство моих каталогов содержали подкаталоги с файлами, размер которых превышал разрешенный лимит загрузки одного файла в 250 МБ. Поэтому требовалась некоторая подготовительная работа.

Я гуглил проблему, ожидая увидеть robocopy решение, но наткнулся на интригующий скрипт powershell от Jugal Shah вместо этого. Опираясь на свои ранее несуществующие знания о powershell, я установил необходимые файлы, немного погуглил, а затем собрал приведенный ниже скрипт, который работал в моем базовом тестировании.

Вопросы

У меня есть пара вопросов, прежде чем я запущу это на своих драгоценных реальных файлах (да, есть резервные копии, но всегда осторожно).

  1. Какие-либо серьезные проблемы с моим подходом ниже, можно ли и нужно ли его улучшить?
  2. Случайно во время тестирования я обнаружил, что скрипт не будет работать со скрытыми папками - является ли эта функция лучшим способом заранее исключить определенные каталоги (скажем, 2013 и 2014) из скрипта? , или это можно сделать прямо в powershell?

Скрипт

#Mention the path to search the files
$path = "c:\temp"
##Find out the files greater than equal to below mentioned size
$size = 249MB
##Limit the number of rows
$limit = 10000
##Find out the specific extension file
$Extension = "*.*"
##script to find out the files based on the above input
get-ChildItem -path $path -recurse -ErrorAction "SilentlyContinue" -include $Extension | ? { $_.GetType().Name -eq "FileInfo" } | where-Object {$_.Length -gt $size} | Move-Item -Destination C:\misc

Моя структура каталогов (первый уровень) введите здесь описание изображения


person brettdj    schedule 27.01.2014    source источник


Ответы (2)


Несколько предложений.

  1. Вам нужно передать результаты в объект Foreach, чтобы вы могли перемещать каждый файл.
  2. Вы можете использовать -whatif для проверки операции перемещения.
  3. Мне нравится тестировать, записывая вывод, чтобы дважды проверить, что я делаю.
  4. Обычный способ проверить, является ли объект файлом или каталогом, — использовать .PSIsContainer.
  5. При использовании канала вы можете перейти на следующую строку для удобочитаемости.

    get-ChildItem $path -recurse -ErrorAction "SilentlyContinue" -include $Extension | 
        Where-Object { !($_.PSIsContainer) -and $_.Length -gt $size } | 
        ForEach-Object {
            Write-Output "$($_.fullname) $($_.Length / 1Mb)"
            Move-Item $_.fullname C:\misc -whatif
        }
    
person Bin    schedule 06.06.2014

Я большой сторонник делать все возможное с помощью PowerShell. Однако ничто не сравнится с робокопированием в таких операциях! Вот Статья TechNet о синтаксисе Robocopy. Обратите особое внимание на раздел «Параметры выбора файла», где вы знакомитесь с аргументом /max:, где вы можете указать максимальный размер файла. Итак, в вашем случае вы захотите указать это: /max: 262144000, чтобы вы получали все файлы размером менее 250 МБ.

person websch01ar    schedule 27.01.2014
comment
Спасибо - я уже прочитал robocopy через Google. Возможно, мне следовало оставить тег Powershell только потому, что мне любопытно посмотреть, как можно оптимизировать этот подход к сценарию. - person brettdj; 28.01.2014
comment
Даже без тега Robocopy я бы поднял его, так как это лучший вариант для вас. - person websch01ar; 29.01.2014