微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何从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}'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。