You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PowerShell文件夹文件信息查询及导出Excel表脚本开发求助

解决PowerShell文件夹文件信息导出Excel(CSV)的问题

嘿,我看了你写的脚本,这里有几个关键问题导致你卡壳了,咱们一步步把它修正过来:

现有代码的核心问题

  • Format-Table毁了导出数据:你在Get-ChildItem后面用了Format-Table,这个命令是专门用来格式化控制台输出的,会把原始的文件对象转换成一堆格式相关的临时对象,再管道到Export-Csv的话,导出的CSV里全是没用的格式数据,根本不是你要的文件信息。
  • 文件夹选择函数的变量bugGet-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"

关键优化说明

  1. 修复文件夹选择逻辑:用Add-Type替代了已被弃用的LoadWithPartialName,增加了取消选择的判断,避免无意义的后续执行。
  2. 分离显示与导出:先把文件信息存到变量$fileInfo里,再分别用于控制台展示和CSV导出,彻底避开Format-Table破坏数据的问题。
  3. 优化大小显示:同时提供KB和MB两种单位的大小,用[math]::Round保留两位小数,看起来更清晰。
  4. 灵活导出路径:用[Environment]::GetFolderPath("Desktop")自动获取当前用户的桌面路径,不用再硬编码。
  5. 导出参数优化:加-NoTypeInformation去掉CSV开头的冗余类型信息,用-Encoding UTF8确保中文等特殊字符显示正常。
  6. 递归可选:如果不需要包含子文件夹的文件,删掉-Recurse参数就行。

小提示

  • 要是你用的是PowerShell 7+,脚本完全兼容,直接跑就行。
  • 获取文件Owner的时候,文件多了会有点慢,因为Get-Acl要逐个读取权限信息,要是不需要这个属性,删掉对应的计算列能提速不少。
  • CSV文件直接用Excel打开时,记得选择分隔符为;,或者用Excel的「导入数据」功能指定分隔符,避免内容错位。

内容的提问来源于stack exchange,提问作者Dustin Zimmermann

火山引擎 最新活动