#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, извините.