PowerShell脚本问题:无法生成含系统名与路径的可用列表
解决PowerShell审计脚本的输出问题
我明白你现在的困扰——脚本跑出来的结果和预期对不上,核心问题出在你最后创建输出对象的方式上,咱们一步步拆解修复:
原脚本的问题所在
你最后创建$Output时,把整个$list(所有子文件夹路径数组)和$list2(所有系统名数组)直接塞给了单个PSObject的两个属性。这就导致输出表格里,Name列是一整串所有路径,Path列是一整串所有系统名,而不是每行对应一个系统名和它的路径。另外,分开的两次循环不仅冗余,还容易出现数组索引错位的风险。
修正后的脚本
咱们把逻辑简化,直接在遍历子文件夹时就创建对应对象,一步到位:
# Path to folder repository. Folder names must be the systems host name. $list_paths = (Import-Csv 'C:\CVS\path\Paths.csv').path # 初始化结果数组与计数器 $outputList = @() $rootFolderCount = 0 $hostFolderCount = 0 # 遍历每个根路径,直接生成对应条目 foreach ($rootPath in $list_paths) { $rootFolderCount++ # 获取当前根路径下的所有子文件夹(-Directory等价于筛选PSIsContainer=$true) $subFolders = Get-ChildItem -Path $rootPath -Directory foreach ($folder in $subFolders) { $hostFolderCount++ # 逐个创建关联好Name和Path的对象 $outputItem = [PSCustomObject]@{ Name = $folder.Name Path = $folder.FullName } $outputList += $outputItem } } # 输出格式化后的结果表格 $outputList | Format-Table -AutoSize | Out-Host # 输出统计信息 Write-Host "Number of root folders: $rootFolderCount" Write-Host "Number of host folders: $hostFolderCount"
关键改进点
- 直接关联Name和Path:遍历子文件夹时立刻创建对应对象,确保系统名和路径一一绑定,从根源避免错位问题。
- 简化逻辑减少冗余:把两次循环合并成嵌套循环,省去额外的数组存储和二次遍历,代码更简洁高效。
- 使用
[PSCustomObject]:这是PowerShell 3.0+推荐的自定义对象创建方式,比New-Object PSObject更直观简洁。 - 优化输出可读性:用
Format-Table -AutoSize让表格自动适配列宽,Out-Host确保表格正确渲染。
这样运行后,你就能得到每行对应一个系统名和其完整路径的列表,完全符合你的需求~
内容的提问来源于stack exchange,提问作者earth4s
相关产品推荐
相关产品推荐

