【问题标题】:PowerShell is not returning correct value when using Measure-Object to find a size of a Directory使用 Measure-Object 查找目录的大小时,PowerShell 未返回正确的值
【发布时间】:2021-12-23 09:53:30
【问题描述】:

我在几台服务器上有一堆文件夹。我正在尝试清理它们以释放磁盘空间。我正在尝试查找 7 年或更长时间未触及的目录。由于文件夹结构以某种方式设置,我想按名称、大小和上次写入时间显示文件夹。到目前为止,我有这个代码。

Get-ChildItem -Path $HDriveServer1 -Depth 1 -Directory -Force | Where-Object { $_.LastWriteTime -le (Get-Date).AddYears(-7)} | Select-Object Name,@{Name='Size';Exp={(Get-ChildItem -Recurse -File -Force | Measure-Object -Property Length -Sum).Sum / 1MB}},LastWriteTime | Out-File $report

名称和上次写入时间似乎输出正确,但大小都显示相同的值。这是我看到的输出,无法弄清楚为什么大小相同。

有什么想法吗?谢谢!

代码输出

【问题讨论】:

  • Get-ChildItem 在您的计算属性内部永远不会给出明确的路径。因此,每次执行时都会获取当前目录(调用脚本的目录)。所以它总是相同的路径。试试Get-ChildItem $_ -Recurse -File -Force
  • 这是有道理的,而且是一个令人瞩目的时刻......不幸的是,这将“大小”列中的值更改为 0。

标签: powershell file directory


【解决方案1】:

正如AdminOfThings 指出的那样,嵌套在calculated property (@{Name=...}) 中的Get-ChildItem 调用缺少输入路径,因此在当前上运行目录而不是管道输入对象指定的目录。

通过管道向嵌套的Get-ChildItem 调用提供此输入目录(反映在automatic $_ variable 中)的稳健方式:

Get-ChildItem -Path $HDriveServer1 -Depth 1 -Directory -Force | 
  Where-Object { $_.LastWriteTime -le (Get-Date).AddYears(-7)} | 
    Select-Object Name,
                  @{
                    Name = 'Size'
                    Expression = {
                      ($_ | Get-ChildItem -Recurse -File -Force | Measure-Object -Property Length -Sum).Sum / 1MB
                    }
                  },
                  LastWriteTime |
     Out-File $report

虽然您期望Get-ChildItem -LiteralPath $_ 等同于
$_ | Get-ChildItem,但在Windows PowerShell中它情境不是, 因为$_字符串化 作为参数,并且有时仅字符串化到它的文件name,而不是完整路径

另一种方法是使用Get-ChildItem -LiteralPath $_.FullName

此问题已在 PowerShell (Core) 7+ 中得到纠正。

请参阅this answer 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2021-03-15
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多