【问题标题】:Get-ChildItem file/folderGet-ChildItem 文件/文件夹
【发布时间】:2012-12-25 13:02:19
【问题描述】:

我试图让Get-ChildItem 检索文件夹的内容,并显示文件夹中每个对象的大小、对象的名称和类型(文件/目录)。但是,我无法仅使这三列起作用。

名称和长度比较简单,但是如何显示文件和文件夹之间的差异?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    我相信通过获取“模式”信息可以做到这一点。 (见这个答案here

    那么,基本上,Get-ChildItem 命令列出的任何“模式”都以“d”开头。

    如果你不想去@Joey的回答,这里是“模式”中6个可能值的实际含义:

    无论如何,完整列表是:

    d - Directory
    a - Archive
    r - Read-only
    h - Hidden
    s - System
    l - Reparse point, symlink, etc.
    

    所以我使用它来输出一个 CSV,然后我将在 excel、我的 Flow 或 SharePoint 中标记文件夹。我使用的命令是:

    Get-ChildItem -Recurse | Select-Object DirectoryName, BaseName, Extension, Mode | Export-Csv -Path INSERTPATH\listings.csv -Encoding ascii -NoTypeInformation
    

    希望这对遇到它的人有所帮助。


    请注意,这是我第一次以完整的回答意图回答。我相信即使这已经 6 年了,人们在尝试实现相同目标时仍然会发现它很有用。

    【讨论】:

      【解决方案2】:

      检查PSIsContainer 属性。对于文件夹,它设置为 $true,对于文件,它设置为 $false。这是一个例子:

      Get-ChildItem | Foreach-Object{
          New-Object PSObject -Property @{
              Name = $_.Name
              SizeMB = if($_.PSIsContainer) { (Get-ChildItem $_.FullName -Recurse | Measure-Object Length -Sum).Sum/1mb  } else {$_.Length}
              Type = if($_.PSIsContainer) {'Directory'} else {'File'}
          }
      }
      

      【讨论】:

      • 再一次赢得了答案。因此,如果我是正确的,您可以为文件夹中的每个对象创建一个属性对象。并且为每个属性对象分配一个名称值、一个大小值和一个基于前一个值的类型值。我唯一不明白的是你如何定义大小。我认为您使用 -recurse 开关来测量整个目录的大小,而对于您使用长度的文件? Measure-Object 也不适用于文件吗?不管怎样,再次感谢!
      • 一个文件有一个 Length 属性,所以我们不需要其他任何东西,只要它知道大小。另一方面,文件夹没有 Length 属性。要计算文件夹大小,我们需要迭代所有文件(递归)并总结所有文件的长度。这就是 Measure-Object cmdlet 派上用场的地方。
      • 不错的算法,@Shay!但是,有一个不一致之处——您正在为目录计算 megabytes 而为文件计算的是 bytes。最简单的解决方法是将属性名称从 SizeMB 更改为 Size 并删除文件夹大小计算中的除以 1mb。
      • 你是绝对正确的@msorence,我添加了 MB 计算只是为了表明它是可能的。我将由读者决定他是否想要以字节或 MB 为单位的结果:)
      猜你喜欢
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 2012-12-28
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      相关资源
      最近更新 更多