Вывести размер файла в powershell
Я пишу административный скрипт, и мне нужно рассчитать размер файлов на диске.
эти файлы находятся на сжатом томе 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 не умеет напрямую определять размер директории. Однако он умеет определять размер отдельных файлов, поэтому мы можем вычислить размер директории, просуммировав все находящиеся в ней файлы. Для этого можно воспользоваться такой командой:
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″;
Вот теперь мы получаем правильный размер директории.
Ну и если требуется вывести подробные данные по размеру директории и всех поддиректорий, то можно воспользоваться следующим скриптом:
Читайте также: