我想獲取 DGFoldersTEST.txt 中列出的每個檔案夾的檔案數和檔案總和。但是,我目前正在獲得所有 3 個檔案夾的總和。現在我收到“索引超出陣列范圍”的錯誤訊息。
$DGfolderlist = Get-Content -Path C:\DiskGroupsFolders\DGFoldersTEST.txt
$FolderSize =@()
$int=0
Foreach ($DGfolder in $DGfolderlist)
{
$FolderSize[$int] =
Get-ChildItem -Path $DGfolderlist -File -Recurse -Force -ErrorAction SilentlyContinue |
Measure-Object -Property Length -Sum |
Select-Object -Property Count, @{Name='Size(MB)'; Expression={('{0:N2}' -f($_.Sum/1mb))}}
Write-Host $DGfolder
Write-Host $FolderSize[$int]
$int
}
uj5u.com熱心網友回復:
為了解釋該錯誤,您嘗試在陣列的索引$int處分配一個值$FolderSize,但是,當使用陣列子運算式 operator@(..)初始化陣列時,它們被初始化為0 Length,因此為什么會出現錯誤。何時使用特定長度初始化它們是不同的:
$arr = @()
$arr.Length # 0
$arr[0] = 'hello' # Error
$arr = [array]::CreateInstance([object], 10)
$arr.Length # 10
$arr[0] = 'hello' # all good
至于如何處理你的代碼,因為你真的不知道有多少專案會從你的回圈中輸出,所以初始化一個具有特定長度的陣列是不可能的。PowerShell 提供了 =向其添加元素的運算子,但是這是一個非常昂貴的操作,而且不是一個好主意,因為每次我們向陣列追加一個新元素時,都必須創建一個新陣列,這是因為陣列屬于固定大小。有關更多資訊和更好的方法,請參閱此答案。
您可以簡單地讓 PowerShell 通過將變數分配給回圈本身來捕獲回圈的輸出:
$FolderSize = foreach ($DGfolder in $DGfolderlist) {
Get-ChildItem -Path $DGfolder -File -Recurse -Force -ErrorAction SilentlyContinue |
Measure-Object -Property Length -Sum |
Select-Object @(
@{ Name = 'Folder'; Expression = { $DGfolder }}
'Count'
@{ Name = 'Size(MB)'; Expression = { ($_.Sum / 1mb).ToString('N2') }}
)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507988.html
