使用PowerShell复制右键单击文件夹并选择属性

时间:2013-07-04 10:43:13

标签: powershell properties directory exe

我正在尝试收集磁盘上的大小/大小以及非常大的文件夹树上的文件/文件夹数。

我一直在使用类似以下的脚本来收集一些内容:

Get-ChildItem "C:\test" -recurse | Measure-Object -Sum Length | Select-Object `
  @{Name="Path"; Expression={$directory.FullName}},
  @{Name="Files"; Expression={$_.Count}},
  @{Name="Size"; Expression={$_.Sum}}

Path                                            Files                      Size
----                                            -----                      ----
C:\test                                         470                    11622961

但是当我想收集有关磁盘上文件夹数量和大小的信息时,我必须运行一个单独的脚本;再次通过文件夹回传(这需要很长时间)。

当您右键单击文件夹并选择下面显示的属性时,是否有一种简单的方法可以访问所有这些信息?

system32中是否有可以执行此操作的可调用.exe文件?

Folder Properties

2 个答案:

答案 0 :(得分:2)

根据Technet论坛中的this answer,您可以像这样计算磁盘上的大小:

$afz = [MidpointRounding]::AwayFromZero
[math]::Round($_.Length / $clusterSize + 0.5, $afz) * $clusterSize
可以使用$clusterSize命令确定

fsutil(例如,对于驱动器C:):

PS C:\> fsutil fsinfo ntfsinfo C:\
NTFS Volume Serial Number :       0x648ac3ae16817308
Version :                         3.1
Number Sectors :                  0x00000000027ccfff
Total Clusters :                  0x00000000004f99ff
Free Clusters  :                  0x0000000000158776
Total Reserved :                  0x00000000000003e0
Bytes Per Sector  :               512
Bytes Per Physical Sector :       512
Bytes Per Cluster :               4096
Bytes Per FileRecord Segment    : 1024
Clusters Per FileRecord Segment : 0
...

请注意,运行fsutil需要管理员权限。

有了这个,您可以收集您感兴趣的信息:

$rootDir = "C:\test"

$afz = [MidpointRounding]::AwayFromZero
$clusterSize = fsutil fsinfo ntfsinfo (Get-Item $rootDir).PSDrive.Root `
  | Select-String 'Bytes Per Cluster' `
  | % { $_.ToString().Split(':')[1].Trim() }

$stat = Get-ChildItem $rootDir -Recurse -Force `
  | select Name, Length, @{n="PhysicalSize";e={
      [math]::Round($_.Length / $clusterSize + 0.5, $afz) * $clusterSize
    }}, @{n="Folder";e={[int]($_.PSIsContainer)}},
    @{n="File";e={[int](-not $_.PSIsContainer)}} `
  | Measure-Object -Sum Length, PhysicalSize, Folder, File

$folder = New-Object -TypeName PSObject -Property @{
    "FullName"   = $rootDir;
    "Files"      = ($stat | ? { $_.Property -eq "File" }).Sum;
    "Folders"    = ($stat | ? { $_.Property -eq "Folder" }).Sum;
    "Size"       = ($stat | ? { $_.Property -eq "Length" }).Sum;
    "SizeOnDisk" = ($stat | ? { $_.Property -eq "PhysicalSize" }).Sum - $clusterSize;
  }

答案 1 :(得分:1)

当您看到每个项目时,您将不得不在自定义对象中累积数据:

$path = "C:\Users\aaron\Projects\Carbon"
$properties = New-Object PsObject -Property @{ 'Path' = $path; 'Files' = 0; 'Folders' = 0; 'Size' = 0 }
Get-ChildItem -Path $path -Recurse |
    ForEach-Object {
        if( $_.PsIsContainer )
        {
            $properties.Folders++
        }
        else
        {
            $properties.Size += $_.Length
            $properties.Files++
        }
    }
$properties