PowerShell文件夹文件信息查询及导出Excel表脚本开发求助
解决PowerShell文件夹文件信息导出Excel(CSV)的问题
嘿,我看了你写的脚本,这里有几个关键问题导致你卡壳了,咱们一步步把它修正过来:
现有代码的核心问题
Format-Table毁了导出数据:你在Get-ChildItem后面用了Format-Table,这个命令是专门用来格式化控制台输出的,会把原始的文件对象转换成一堆格式相关的临时对象,再管道到Export-Csv的话,导出的CSV里全是没用的格式数据,根本不是你要的文件信息。- 文件夹选择函数的变量bug:
Get-Folder里的$folder +=是错的,第一次运行时$folder根本没初始化,直接赋值$folder = $foldername.SelectedPath就行,不然用户选完文件夹可能返回异常值。 - 硬编码路径太死板:固定写死
C:\Users\DZimmermann\Desktop\Test.csv,换个用户或者路径就会报错,不如用系统变量自动获取桌面路径。 - 没区分文件和文件夹:
Get-ChildItem默认会把文件夹也列出来,如果你只想导出文件信息,得加-File参数过滤。
修正后的完整可运行脚本
Function Get-Folder($initialDirectory) { # 改用Add-Type替代弃用的LoadWithPartialName Add-Type -AssemblyName System.Windows.Forms $foldername = New-Object System.Windows.Forms.FolderBrowserDialog $foldername.Description = "Select the target folder" $foldername.RootFolder = "MyComputer" # 支持传入初始目录 if ($initialDirectory) { $foldername.SelectedPath = $initialDirectory } if ($foldername.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) { return $foldername.SelectedPath } # 用户取消选择时返回null,后续做判断 return $null } # 获取目标文件夹,取消则退出 $targetFolder = Get-Folder if (-not $targetFolder) { Write-Host "Folder selection cancelled. Exiting." exit } # 收集文件信息,按需调整属性 $fileInfo = Get-ChildItem -Path $targetFolder -File -Recurse | Select-Object Name, @{Name="Size (KB)"; Expression={[math]::Round($_.Length / 1KB, 2)}}, @{Name="Size (MB)"; Expression={[math]::Round($_.Length / 1MB, 2)}}, Attributes, LastAccessTime, LastWriteTime, @{Name="Owner"; Expression={(Get-Acl $_.FullName).Owner}} # 先在控制台展示格式化后的信息 $fileInfo | Format-Table -AutoSize # 导出到CSV(Excel直接就能打开) $exportPath = Join-Path -Path [Environment]::GetFolderPath("Desktop") -ChildPath "FileInventory.csv" $fileInfo | Export-Csv -Path $exportPath -Delimiter ";" -NoTypeInformation -Encoding UTF8 Write-Host "Successfully exported file info to: $exportPath"
关键优化说明
- 修复文件夹选择逻辑:用
Add-Type替代了已被弃用的LoadWithPartialName,增加了取消选择的判断,避免无意义的后续执行。 - 分离显示与导出:先把文件信息存到变量
$fileInfo里,再分别用于控制台展示和CSV导出,彻底避开Format-Table破坏数据的问题。 - 优化大小显示:同时提供KB和MB两种单位的大小,用
[math]::Round保留两位小数,看起来更清晰。 - 灵活导出路径:用
[Environment]::GetFolderPath("Desktop")自动获取当前用户的桌面路径,不用再硬编码。 - 导出参数优化:加
-NoTypeInformation去掉CSV开头的冗余类型信息,用-Encoding UTF8确保中文等特殊字符显示正常。 - 递归可选:如果不需要包含子文件夹的文件,删掉
-Recurse参数就行。
小提示
- 要是你用的是PowerShell 7+,脚本完全兼容,直接跑就行。
- 获取文件Owner的时候,文件多了会有点慢,因为
Get-Acl要逐个读取权限信息,要是不需要这个属性,删掉对应的计算列能提速不少。 - CSV文件直接用Excel打开时,记得选择分隔符为
;,或者用Excel的「导入数据」功能指定分隔符,避免内容错位。
内容的提问来源于stack exchange,提问作者Dustin Zimmermann




