Вывести размер файла в powershell

Обновлено: 05.07.2024

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

эти файлы находятся на сжатом томе NTFS.

Я не могу использовать FileInfo.Length , потому что это размер файла, а не размер на диске. Например, если у меня есть файл 100MB, но он использует только 25MB из-за сжатия NTFS, мне нужен мой скрипт для возврата 25MB.

есть ли способ сделать это в PowerShell?

(Я знаю, о GetCompressedFileSize() вызов Win32, но я надеялся, что это уже обернуто на каком-то уровне.)

и я создал свойство скрипта для объекта FileInfo: CompressedSize.

вот что я сделал: (примечание: Я совершенно новичок в Powershell, или, по крайней мере, я не использую его много. Это, вероятно, можно было бы сделать намного лучше, но вот что я сделал:

во-первых, я скомпилировал Ntfs.ExtendedFileInfo от поста Goyuix по. Я поместил DLL в каталог профиля Powershell (\Документы Каталог WindowsPowerShell)

затем я создал файл в каталоге моего профиля с именем My.Типы.ps1xml.

Я поместил в файл следующий XML:

этот код (после объединения в систему типов) динамически добавит свойство CompressedSize к объектам FileInfo, возвращаемым get-childitem/dir. Но Powershell еще не знает о коде, и он еще не знает о моей DLL. Мы справимся с этим в следующем шаг:

Редактировать Профиль.ps1. в том же каталоге. Теперь в моем файле профиля уже есть некоторые вещи, потому что у меня установлены расширения сообщества для powershell. Надеюсь, я включу все, что вам нужно, в этот следующий фрагмент кода, чтобы он работал даже на машине, у которой нет расширений. Добавьте следующий код в профиль.ps1:

Теперь переменная $ProfileDir, на которую я ссылаюсь, определена ранее в моем профиле.ps1 скрипт. На всякий случай, если это не в вашем, вот определение:

вот именно. При следующем запуске Powershell можно получить доступ к свойству CompressedSize объекта FileInfo так же, как если бы это было любое другое свойство. Пример:

$myFile = dir c:\temp\myfile - . txt

это работает (на моей машине, во всяком случае), но я хотел бы услышать, подходит ли он на практике. Я знаю, что делаю одну вещь. неверно: в профиле.ps1 файл, я возвращаю результаты LoadFile в переменную, которую я не собираюсь использовать ($null = бла-бла). Я сделал это, чтобы подавить отображение результата загрузки файла на консоль. Возможно, есть лучший способ сделать это.

Aternatively, вы можете скомпилировать свою собственную DLL и загрузить сборку для этой одной функции:

и, наконец, загрузить и запустить В PowerShell:

эксперимент! Наслаждайтесь! Подключайтесь!

Если вы не можете найти управляемый API, который вам нравится, в PowerShell V2 намного проще P/вызвать Win32 API. Читать PowerShell P / Вызвать Пошаговое Руководство для инструкциям.

обратите внимание, что это не возвращает "размер на диске", который отображается в Проводнике Windows, esp. для небольших файлов.

(почти) правильный способ получить эту информацию описан в получение "размера на диске" для небольших файлов в Powershell

$s=(компактный / q C:\whatever - . dat / where-object ).split ()>;$s[8].padleft (20)+$s[0].padleft(20)

и по этому нужно суммировать размеры всех файлов в каталоге и в подкаталогах.

$l = Get-ChildItem путь к каталогу -recurse -Force | Measure-Object -Property Length -Sum

а так $l.sum /1mb POSH покажет размер в мегабайтах

Так же можно отформатировать вывод, к примеру выводить после запятой 2 знака

$FolderSize = (Get-ChildItem X:\temp -recurse -Force | Measure-Object -Property Length -Sum).Sum / 1Mb

Об авторе Alex

Работаю Администратором. В основном Windows. Специализируюсь на Hyper-V Запись опубликована в рубрике Powershell, Администрирование с метками Powershell. Добавьте в закладки постоянную ссылку.

4 комментария: Подсчёт размера каталога и файла Powershell

Подскажите а как можно вывести сумарный размер файлов для каждого расширения в определенной папке?

Как то так, покажет размер всех txt файлов в каталоге:

Get-ChildItem "D:\test\" -recurse -Force | Where-Object | Measure-Object -Property Length -Sum

Или сразу размер на примере VHD

(Get-ChildItem "D:\hyper-V\Users\Hyper-V" -recurse -Force | Where-Object | Measure-Object -Property Length -Sum).sum /1mb

Подскажите а как можно сгруппировать файлы по расширениям и для каждой группы вывести суммарный размер всех файлов в ней?

Выше в коментах ответ на схожий с вашим вопрос, нужно малость накодить: Как то так:

param ($Folder, $ExtList)

Function Sum ($Path, $FileExt)
$FileExt = "." + $FileExt

$Sum = (Get-ChildItem $Path -recurse -Force | where | Measure-Object -Property Length -Sum).Sum / 1Mb
$Count = (Get-ChildItem $Path -recurse -Force | where | Measure-Object -Property Length -Sum).Count
Write-host "Файлов $FileExt $Count шт. Размер= $Sum"

Write-host "========= Суммарный объём файлов в каталоге $Folder : ======== ;"

Foreach ($Ext in $Arrayext)

========= Суммарный объём файлов в каталоге c:\tmp : =========
Файлов .exe 2 шт. Размер= 16.0344390869141
Файлов .txt 3 шт. Размер= 0.000396728515625
Файлов .pdf шт. Размер= 0

Что я пытаюсь сделать, это создать сценарий PS, чтобы увидеть, когда в определенной папке есть файл размером более 1 ГБ. Если он обнаружил файл размером более 1 ГБ, я хочу, чтобы он записал файл журнала с информацией, содержащей имя определенного файла и его размер.

Это работает, но не полностью, если файл меньше 1 ГБ, я не хочу файл журнала. (прямо сейчас это отобразит информацию о файле более 1 ГБ, но если его меньше 1 ГБ, он все равно создает файл журнала без данных). Я не хочу создавать журнал для чего-то меньшего, чем 1 ГБ.

Есть идеи, как это сделать?

2 ответа

Чтобы убедиться, что вы не пишете пустые файлы, вы должны собрать минимальные начальные результаты, которые соответствуют вашему фильтру, и проверить их, чтобы увидеть, содержат ли они вообще что-либо.

Затем, если они включены, вы можете редактировать сценарий, но если они это сделают, вы можете выполнить сортировку, выбрать данные и вывести их в файл журнала.

В приведенном выше сценарии я исправил $. как $_. , и отделил сопоставление файлов 1 ГБ от их манипулирования и вывод их в файл.

Мы просто проверяем, совпадают ли какие-либо файлы на 1 ГБ, проверяя, имеет ли переменная какие-либо результаты или $NULL / не определено.

Если это так, нет необходимости предпринимать какие-либо дальнейшие действия.

Только когда файлы размером 1 Гбайт сопоставляются, мы быстро sort их и select нужных вам деталей, но вместо этого мы просто используем Format-Table ( FT ) с > чтобы получить приятный на вид вывод, который намного проще просмотреть для такого рода данных.

(Примечание Format-Table выбирает и форматирует информацию в таблицу за один шаг, сохраняя ненужный шаг использования Select для получения данных, а затем отправляет ( | ) их в > или Format-Table , поскольку это просто добавляет немного лишнего шага. Select-Object лучше всего использовать, когда вам нужно будет выполнить дополнительные шаги с этими данными, которые требуют «объектно-ориентированных» операций на будущих шагах. )

Затем мы передаем эти выходные данные, чтобы сохранить их в файле журнала, используя Out-File , и я также изменил имя файла журнала, чтобы оно содержало текущую дату и время в формате ISO filesize_$(Get-Date -F "yyyy-MM-dd_HH-mm-ss").log , чтобы вы могли сохранить каждый прогон и рассмотрите их позже, и вам не захочется иметь один гигантский файл или историю запусков.

Сначала установите переменную с нужным вам термином / фильтром и сохраните результаты

Затем направьте это к Out-File к желаемому выходному пути. В этом примере будет выведен файл на рабочий стол пользователя, выполняющего сценарий, при необходимости измените:

Определить размер директории в Windows достаточно просто. Однако, если требуется сделать это с помощью PowerShell, то с этим могут возникнуть некоторые трудности.

Для примера выведем свойства директории с помощью командлета Get-Item:

Команда Get-Item возвращает основные свойства объекта, такие как его тип, имя, время последнего изменения и размер. Однако в случае с директорией размер (length) всегда остается пустым.

свойства папки в PowerShell

Это не ошибка, просто PowerShell не умеет напрямую определять размер директории. Однако он умеет определять размер отдельных файлов, поэтому мы можем вычислить размер директории, просуммировав все находящиеся в ней файлы. Для этого можно воспользоваться такой командой:

Get-Item C:\Files\* | measure -Property length -Sum;

либо такой (что одно и то же):

Get-ChildItem C:\Files | measure -Property length -Sum;

В поле Sum мы видим общий размер всех файлов в папке, что по идее и является ее размером.

вывод размер папки без форматирования

Для красоты переведем размер из байт в мегабайты и отформатируем вывод с помощью оператора форматирования (-f):

$FolderSize = Get-ChildItem C:\Files | measure -Property length -Sum;
″″ -f $($FolderSize.Sum/1MB) +″MB″;

вывод размер папки с форматированием

В итоге получаем размер директории 9.32MB. Для проверки откроем свойства папки в проводнике и сравним полученный результат с ее реальным размером. Как видите, данные не совпадают, реальный размер директории составляет 120MB.

свойства папки в проводнике

$FolderSize = Get-ChildItem C:\Files -Recurse | measure -Property length -Sum;
″″ -f $($FolderSize.Sum/1MB) +″MB″;

Вот теперь мы получаем правильный размер директории.

размер папки с учетом подпапок

Ну и если требуется вывести подробные данные по размеру директории и всех поддиректорий, то можно воспользоваться следующим скриптом:

Читайте также: