PowerShell脚本优化:实现文件相对路径与MB大小分栏及CSV对比
解决方案
一、生成格式正确的分栏CSV
原脚本直接拼接字符串输出,无法保证CSV列的正确性,且未将文件大小转换为MB单位。以下是改进后的脚本,会生成包含相对路径和MB单位大小的标准CSV:
$srcpth = "C:\Users\vavenkatamanoj\Downloads" $outputCsv = "C:\Users\vavenkatamanoj\Downloads\check.csv" # 遍历文件并生成结构化数据 $fileData = Get-ChildItem -Path $srcpth -File -Recurse | ForEach-Object { # 计算相对路径,自动处理原路径末尾的反斜杠问题 $relativePath = $_.FullName.Substring($srcpth.Length).TrimStart('\') # 将字节转换为MB,保留2位小数 $sizeInMB = [math]::Round($_.Length / 1MB, 2) # 返回包含所需字段的自定义对象 [PSCustomObject]@{ RelativePath = $relativePath SizeMB = $sizeInMB FullPath = $_.FullName # 预存绝对路径,方便后续对比 } } # 导出为标准CSV,自动生成表头,处理特殊字符 $fileData | Select-Object RelativePath, SizeMB | Export-Csv -Path $outputCsv -NoTypeInformation -Encoding UTF8
关键改进点:
- 使用
Export-Csv替代Out-File:自动生成CSV表头,正确处理路径中的逗号、空格等特殊字符,确保列分隔准确。 - 可靠的相对路径计算:通过
Substring+TrimStart('\'),无论原路径末尾是否带反斜杠,都能得到正确的相对路径。 - 文件大小转换:用PowerShell内置的
1MB常量将字节转换为MB,并用[math]::Round控制小数位数。
二、对比两个CSV并导出不匹配文件
假设需要对比的目标CSV路径为C:\Users\vavenkatamanoj\Downloads\compare.csv(需包含RelativePath列),以下脚本会找出生成的CSV中存在但对比CSV中不存在的文件,导出其绝对路径和大小:
$compareCsv = "C:\Users\vavenkatamanoj\Downloads\compare.csv" $mismatchOutput = "C:\Users\vavenkatamanoj\Downloads\mismatch_files.csv" # 导入两个CSV文件 $generatedFiles = Import-Csv -Path $outputCsv $compareData = Import-Csv -Path $compareCsv # 将对比CSV的路径存入哈希表,提升查找效率 $existingPaths = @{} foreach ($item in $compareData) { $existingPaths[$item.RelativePath] = $true } # 筛选出不匹配的文件,提取绝对路径和大小 $mismatchedFiles = $fileData | Where-Object { -not $existingPaths.ContainsKey($_.RelativePath) } | Select-Object FullPath, SizeMB # 导出不匹配结果 $mismatchedFiles | Export-Csv -Path $mismatchOutput -NoTypeInformation -Encoding UTF8
说明:
- 如果需要双向对比(即找出对比CSV中有但生成CSV中没有的文件),可以反向筛选一次后合并结果。
- 如果对比CSV的路径列名不是
RelativePath,需将脚本中的$item.RelativePath替换为对应列名。
内容的提问来源于stack exchange,提问作者user20468663
相关产品推荐
相关产品推荐

