问题描述
我只是想要一些帮助,从我的输出中删除 @{}
字符
我的脚本是从特定驱动器或目录中获取文件夹大小
这是我的脚本
$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-Object
和 Add-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}'