Як знайти великі файли на диску за допомогою PowerShell

Коли система оповіщає вас про те, що на диску закінчується вільний простір, перше що робить адміністратор - намагається знайти все великі файли, які займають найбільше місця. Ви можете використовувати для пошуку великих файлів провідник Windows (є кілька зумовлених шаблонів пошуку за розміром), улюблений файловий менеджер або сторонні утиліти. Однак всі ці кошти, на відміну від PowerShell, вимагає установки на комп'ютері. Розглянемо приклад швидкого пошуку великих файлів на диску за допомогою PowerShell.

Для отримання списку файлів в певному каталозі (включаючи підпапки) і їх розмірів можна використовувати командлет Get-ChildItem. Командлет може шукати файли по всьому диску, або в певній папці (наприклад в призначених для користувача профілях або будь-яких інших папках).

Виведемо список 10 найбільших файлів на диску C: \:

Get-ChildItem c: \ -r | sort -descending -property length | select -first 10 name, Length

Залежно від розміру диска і кількості файлів на ньому, виконання команди може зайняти деякий час.

ключ -r (Recurse) вказує, що необхідно рекурсивного обійти всі вкладені об'єкти (каталоги). Можна обмежити перевірку певним рівнем вкладеності за допомогою параметра -Depth.

Якщо не вказувати шлях, пошук буде виконаний за всіма підкаталогам в поточному каталозі.

Як ви бачите, ми отримали список з десяти найбільших файлів на диску, відсортоване в порядку зменшення розміру файлу.

Порада. При доступі до деяких каталогах навіть з правами адміністратора, командлет може повернути помилку доступу:

Get-ChildItem: Немає доступу по шляху "C: \ Windows \ CSC".
рядок: 1 знак: 1
+ Get-ChildItem c: \ -r | sort -descending -property length | select -firs ...
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo: PermissionDenied: (C: \ Windows \ CSC: String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId: DirUnauthorizedAccessError, Microsoft.PowerShell.Commands.GetChildItemCommand

Щоб придушити появу таких помилок іспользуйтей параметр -ErrorAction SilentlyContinue.

Як ви бачите, розмір файлів відображається в байтах. Для зручності їх можна перетворити в мегабайти. Крім того, можна вивести каталог, в якому зберігається знайдений файл:

Get-ChildItem c: \ -r -ErrorAction SilentlyContinue | sort -descending -property length | select -first 10 name, DirectoryName, @ Name = "Мб"; Expression = [Math] :: round ($ _. length / 1MB, 2)

Отриману табличку можна перетворити в зручну графічну форму за допомогою командлета Out-GridView:

Get-ChildItem c: \ -r | sort -descending -property length | select -first 10 name, DirectoryName, @ Name = "Мб"; Expression = [Math] :: round ($ _. length / 1MB, 2) | Out-GridView

Аналогічним чином ви можете знайти всі файли, розмір яких більше певного значення, наприклад, 200 Мб):

$ Size = 200 * 1024 * 1024
GCi C: \ -recurse -ErrorAction SilentlyContinue | where-object $ _. length -gt $ size | Sort-Object length | ft fullname

Список файлів можна вивантажити в CSV файл так:

GCi C: \ -recurse | where-object $ _. length -gt $ size | Sort-Object length | ft fullname | Export-Csv c: \ pc \ LargeFiles_Report.csv

Якщо потрібно порахувати розмір всіх файлів в каталозі, скористайтеся статтею: Як визначити розмір директорії за допомогою PowerShell.