【问题标题】:Get size and size on disk of files获取文件磁盘上的大小和大小
【发布时间】:2021-04-17 05:04:42
【问题描述】:

我有一个简单的 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 访问所述属性的正确方法。

如何从 PowerShell 中获取文件属性中所见的 Size On Disk 参数?

【问题讨论】:

  • 也许你可以使用this cmdlet。
  • 谢谢@Vivere。我正在寻找 ForEach-Object 中的特定属性,但似乎没有,您必须自己构建。谢谢。

标签: windows powershell


【解决方案1】:

你可以做一些数学技巧。根据DelphicOracle 来自here 的评论,您可以根据驱动器的分配单元大小来计算它。

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

基本上,您检查驱动器的 AllocationUnitSize 与文件的实际长度匹配的次数,如果该除法有休息,则将其设置为上限。

【讨论】:

  • 很棒的解决方案,虽然不应该使用Floor 吗?因为不适合一个单元的多余数据会消耗一个新单元,所以您想添加这些数据而不是丢弃它?
  • 如果您有一个 4100 字节的文件,并且您的驱动器的分配单元大小为 4096,则您需要 8192 字节来存储该文件,因为您无法从中剪切信息。
  • 这正是我要说的,Ceiling 返回 4096 但它应该返回 8192,所以你需要 Floor 来获得更大的数字。
  • 不,Ceil(4100/4096) = 2; 2 * 4096 = 8192。楼层(4100/4096)= 1; 1 * 4096 = 4096。可能我们说的不是同一件事。我在 cmdlet 中执行的操作是检查 4096 适合文件长度的次数,ceiled 以适应更多 4096 块的需要。
  • 你说得对,我弄错了 MSDN 文档,抱歉。
猜你喜欢
  • 2020-10-17
  • 2011-04-14
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
相关资源
最近更新 更多