我希望有人可以指出我正确的方向。我编写了一个脚本来搜索找到的目录和列表文件。我想使用format-table来显示它,但是我很难理解如何在对象中正确地收集结果,因为会有重复的键和值。
以下脚本仅适用于找到的第一个文件 - 我假设是因为它重新添加了具有相同文件和目录名称的成员。
我花了好几天时间试图解决这个问题并尽我所能阅读,我只是不明白。我非常感谢被送往正确的方向。
非常感谢您的帮助。我还要提一下,我被困在使用v1。
$servers = @{
"1" = @(
"C:\a","C:\b"
)
}
foreach ($h in $servers.GetEnumerator()) {
$d = @($h.Value)
foreach ($dir in $d) {
if (!(Test-Path -Path $dir)) {
Write-Host $($h.Name)
Write-Host $dir" DOES NOT EXIST"
} else {
$file = Get-ChildItem "$dir" -recurse | Where-Object {$_ -is [IO.FileInfo]}
if (!($file -eq $null)) {
Write-Host $($h.Name)
$result = New-Object PSObject
foreach ($f in $file) {
$result | Add-Member -MemberType NoteProperty Directory -Value $f.directory
$result | Add-Member -MemberType NoteProperty File -Value $f.name
}
}
Write-Output ($result | Format-Table | Out-String)
}
}
}
答案 0 :(得分:2)
你在那里是alomst :-) 您正在为找到的每个文件创建一个对象。但是,您需要将所有这些对象存储在某处(每次找到文件时,$ result基本上都会被覆盖,因此它只在循环内有效)。你需要做的是将$ result的每个“实例”发送到其他地方。如果你将我的建议与你的建议进行比较,你会看到唯一的区别是我已经将“new-psobject”调用移到了foreach文件循环中,并添加了一个数组来实际存储结果。 顺便说一句,我不能强调PowerShell有一个非常好的调试故事,允许你基本上通过这样的代码。花时间学习如何使用它,你不会被这样的东西困住: - )
foreach ($h in $servers.GetEnumerator()) {
$d = @($h.Value)
$resultarray = @()
foreach ($dir in $d) {
if (!(Test-Path -Path $dir)) {
Write-Host $($h.Name)
Write-Host $dir" DOES NOT EXIST"
} else {
$file = Get-ChildItem "$dir" -recurse -ErrorAction 0 | Where-Object {$_ -is [IO.FileInfo]}
if (!($file -eq $null)) {
Write-Host $($h.Name)
foreach ($f in $file) {
$result = New-Object PSObject
$result | Add-Member -MemberType NoteProperty Directory -Value $f.directory
$result | Add-Member -MemberType NoteProperty File -Value $f.name
$resultarray += $result; $result=$null
}
}
Write-Output ($resultarray | Format-Table | Out-String)
}
}
}