如何从powershell的输出中删除@{}字符

问题描述

我只是想要一些帮助,从我的输出删除 @{} 字符 我的脚本是从特定驱动器或目录中获取文件夹大小 这是我的脚本

$HugeFileSizefolder= @() -join ','
$folder = "E:\New Folder\"
Get-ChildItem -Recurse $folder | Where-Object { $_.PSIsContainer } | 
ForEach-Object { 
    $obj = New-Object PSObject  
    $Size = [Math]::Round((Get-ChildItem -Recurse $_.FullName | Measure-Object Length -Sum -ErrorAction SilentlyContinue).sum / 1000MB,2) 
    $obj | Add-Member -MemberType NoteProperty -Name  "Path" $_.FullName 
    $obj | Add-Member -MemberType NoteProperty -Name  "SizeGB" $Size        
    if ($Size -ge   2)
    {
        $HugeFileSizefolder +=$obj
    }
}
$HugeFileSizefolder | Out-string
$HugeFileSizefolderFound = [boolean] $HugeFileSizefolder

这是一个示例输出 @{Path=E:\New Folder\Folder1; SizeGB=3.4GB} 我已经尝试了建议的调整,但不知何故我无法让它正常工作,也许我做得不对。

非常感谢您的意见和建议

谢谢 新手

解决方法

$HugeFileSizeFolder = @() -join ','

这使得 $HugeFileSizeFolder 包含一个 string(空字符串),而不是一个空的 array,正如您的意图 - 您稍后尝试的数组附加到 +=

因为 $HugeFileSizeFolder 是一个 string+= 执行 string concatenation,从而产生诸如 @{Path=E:\New Folder\Folder1; SizeGB=3.4GB} 的表示[1]

虽然$HugeFileSizeFolder = @() 给你一个空数组,但最好避免使用+=迭代扩展数组,因为这样做需要创建每次迭代的幕后数组 - 参见this answer

更有效且更简单的替代方法是将管道用作赋值语句,自动为您收集所有输出:

$folder = "E:\New Folder"

$HugeFileSizeFolder = 
  Get-ChildItem -Recurse $folder | 
    Where-Object { $_.PSIsContainer } |
      ForEach-Object { 
        $obj = New-Object PSObject  
        $Size = [Math]::Round((Get-ChildItem -Recurse $_.FullName | Measure-Object Length -Sum -ErrorAction SilentlyContinue).sum / 1000MB,2) 
        $obj | Add-Member -MemberType NoteProperty -Name  "Path" $_.FullName 
        $obj | Add-Member -MemberType NoteProperty -Name  "SizeGB" $Size        
        if ($Size -ge 2) {
          # Output the object; all output objects are collected
          # in $HugeFileSizeFolder
          $obj 
        }
      }
    }

# Output the result (no need for Out-String)
$HugeFileSizeFolder

$HugeFileSizeFolderFound = [boolean] $HugeFileSizeFolder

顺便说一句:从 v3 开始,PowerShell 为创建 [pscustomobject] 提供了相当简洁和有效的文字表示法,因此您的基于 New-ObjectAdd-Member对象构造可以简化为:

$obj = [pscustomobject] @{
  Path = $_.FullName
  SizeGB = [Math]::Round((Get-ChildItem -Recurse $_.FullName | Measure-Object Length -Sum -ErrorAction SilentlyContinue).Sum / 1000MB,2)
}

[1] 一个简单的演示:'!' + [pscustomobject] @{ foo = 'bar' } 产生 '!@{foo=bar}'