Получить размер и размер файлов на диске

#windows #powershell

Вопрос:

У меня есть простой скрипт PowerShell, который составляет список всех файлов в каталоге и печатает его в файл .txt следующим образом

 $currentDir = 'C:files'
Get-ChildItem $currentDir -Recurse -Force | ForEach-Object {
    $_.BaseName   "|"   $_.Extension   "|"   '{0:N2}' -f ($_.length/1MB) >> files_log.txt
}
 

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

 BaseName | Extension | Size | Size_on_Disk
file | .pdf | 0.06 | 1.00
file2 | .mp3 | 0.30 | 1.00
 

Я искал, но я получаю только результаты о том, как получить сумму размеров на диске для файлов в папке. Я не нашел правильного способа получить доступ к указанной собственности ForEach-Object .

Как я могу получить Size On Disk параметр, указанный в свойствах файла, из PowerShell?

Комментарии:

1. Возможно, вы могли бы использовать этот командлет.

2. Спасибо @Vivere. Я искал конкретное свойство в объекте ForEach, но, похоже, его нет, и вам нужно создать свое собственное. Спасибо.

Ответ №1:

Ты мог бы проделать несколько математических трюков. Согласно этому комментарию отсюда, DelphicOracle вы можете рассчитать его на основе размера единицы распределения вашего диска.

 function Get-SizeOnDisk {
    [CmdletBinding()]
    [OutputType([int64])]
    param (
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
        [string]
        $Path
    )

    process {
        $absolutePath = ($Path | Resolve-Path).Path
        $item = Get-Item $absolutePath
        $volume = Get-Volume $item.PSDrive.Name

        $d = [int][System.Math]::Ceiling($item.Length / $volume.AllocationUnitSize)
        return $d * $volume.AllocationUnitSize
    }
}

'myItem.ext' | Get-SizeOnDisk

 

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

Комментарии:

1. Потрясающее решение, хотя Floor его не следует использовать? потому что избыточные данные, которые не помещаются в одну единицу, потребляют новую единицу, поэтому вы хотите добавить эти данные, а не выбрасывать их?

2. Если у вас есть файл размером 4100 байт, а размер единицы размещения вашего диска составляет 4096, вам потребуется 8192 байта для хранения этого файла, потому что вы не можете вырезать из него информацию.

3. Это именно то, что я говорю, Ceiling возвращает 4096, но он должен вернуть 8192, поэтому вам нужно Floor получить большее число.

4. Нет, Сейл(4100/4096) = 2; 2 * 4096 = 8192. Пол(4100/4096) = 1; 1 * 4096 = 4096. Возможно, мы говорим не об одном и том же. Что я делаю в командлете, я проверяю, сколько раз 4096 соответствует длине файла, ceiled чтобы учесть необходимость в еще одном блоке 4096.

5. Вы правы, я неправильно понял документы MSDN, извините.