PowerShell Group-Object遇大括号报错,求可行解决方法
问题:处理含大括号文件名的校验和日志脚本报错
示例日志文件
Checksumlog1
HEADERINFO 18545E9BB9BC5669B755FA080327654EBDF6D49E6356FE24EEA774B282925BFB \steamapps\appmanifest_1036890.acf 798 20230919_003055 E7D827A9819C00492D48CA6C5086ACB7B9DB23E21C43CD4A76668878ACF21484 \steamapps\appmanifest_1046030.acf 793 20231124_005300 442175C0E8F340DDA951C94CFEE503A227645234C23820CC921E7AB71AEFCF69 \steamapps\appmanifest_1086410.acf 762 20230413_034326 BC93D12F756BDE996671C728293756F1DE8CD4B27C0DA623885592E1EC462009 \steamapps\appmanifest_1091500.acf 925 20231026_112000 9D0A9B7E826128B02C3504C554D2965DF65E0A91056200D7B275875FFEEDEC49 \steamapps\appmanifest_1151640.acf 901 20230512_235832
Checksumlog2
HEADERINFO BC93D12F756BDE996671C728293756F1DE8CD4B27C0DA623885592E1EC46200? \steamapps\{appmanifest_1091500}.acf 925 20231026_112000 9D0A9B7E826128B02C3504C554D2965DF65E0A91056200D7B275875FFEEDEC49 \steamapps\appmanifest_1151640.acf 901 20230512_235832 7B62186E313EFEA918599B049B1C1B22E3875C5CE542BDC50DB4BCF118397D66 \steamapps\appmanifest_1153640.acf 824 20230713_005243 B47CA151C7542B3C2937626A3513509284E2DF2C34C392A37BF2CC88502D07A0 \steamapps\appmanifest_1164940.acf 828 20231108_120209 5CBE6C2DE7CC4954E7D423C9B75D0B59986673FC36A3CD398E3FB89ED0F8B28F \steamapps\appmanifest_1174180.acf 1420 20231121_211150
使用的脚本代码
$checksumlog1Content = Get-Content "checksumlog1.log" -Encoding UTF8 | Select -skip 1 $checksumlog2Content = Get-Content "checksumlog2.log" -Encoding UTF8 | Select -skip 1 $checksumlog1Objects = $checksumlog1Content | ForEach-Object { $checksum = ($_ -Split ' ',2)[0] $file = ((($_ -Split ' ',2)[1]) -split ' ' | select -skiplast 2) -join ' ' $sizedate = ($_ -Split ' ' | select -last 2) -join ' ' [PSCustomObject]@{ 'Hash' = $checksum 'File' = $file 'SizeDate' = $sizedate } } $checksumlog2Objects = $checksumlog2Content | ForEach-Object { $checksum = ($_ -Split ' ',2)[0] $file = ((($_ -Split ' ',2)[1]) -split ' ' | select -skiplast 2) -join ' ' $sizedate = ($_ -Split ' ' | select -last 2) -join ' ' [PSCustomObject]@{ 'Hash' = $checksum 'File' = $file 'SizeDate' = $sizedate } } $CompareLog1Log2Obj = Compare-Object $checksumlog1Objects $checksumlog2Objects -Property Hash,File,SizeDate -PassThru -IncludeEqual| ForEach-Object { $_ } $nonMatchLog1Obj = $CompareLog1Log2Obj | Where-Object SideIndicator -eq '<=' $nonMatchLog2Obj = $CompareLog1Log2Obj | Where-Object SideIndicator -eq '=>' $groupDiff = Compare-Object $nonMatchLog1Obj $nonMatchLog2Obj -IncludeEqual -Property Hash,File -PassThru | Group-Object File | Where-Object Count -ge 2 ForEach ($item in $groupdiff.Group) { "$($item.Hash) $($item.File) $($item.SizeDate) $($item.SideIndicator)" }
报错信息
Input string was not in a correct format. Failure to parse near offset 12. Expected an ASCII digit.
解决方案
报错原因是Group-Object File会将属性名当作格式字符串解析,文件名中的{}属于格式占位符,触发了解析错误。
有两种简单的修复方式:
- 给
Group-Object的Property参数加上单引号,强制按字面量处理属性名:
$groupDiff = Compare-Object $nonMatchLog1Obj $nonMatchLog2Obj -IncludeEqual -Property Hash,File -PassThru | Group-Object 'File' | Where-Object Count -ge 2
- 使用脚本块指定分组依据,绕开格式解析逻辑:
$groupDiff = Compare-Object $nonMatchLog1Obj $nonMatchLog2Obj -IncludeEqual -Property Hash,File -PassThru | Group-Object { $_.File } | Where-Object Count -ge 2
修改后脚本即可正常处理包含大括号的文件名。
内容的提问来源于stack exchange,提问作者HTWingNut
相关产品推荐
相关产品推荐

