You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会将属性名当作格式字符串解析,文件名中的{}属于格式占位符,触发了解析错误。

有两种简单的修复方式:

  1. 给Group-Object的Property参数加上单引号,强制按字面量处理属性名:
$groupDiff = Compare-Object $nonMatchLog1Obj $nonMatchLog2Obj -IncludeEqual -Property Hash,File -PassThru | Group-Object 'File' | Where-Object Count -ge 2
  1. 使用脚本块指定分组依据,绕开格式解析逻辑:
$groupDiff = Compare-Object $nonMatchLog1Obj $nonMatchLog2Obj -IncludeEqual -Property Hash,File -PassThru | Group-Object { $_.File } | Where-Object Count -ge 2

修改后脚本即可正常处理包含大括号的文件名。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:45:55