powershell export-csv 异常行为

powershell export-csv unusual behavior

我在将输出导出为 CSV 时遇到异常问题。 使用下面列出的代码,我基本上可以完成我需要的,这是一个文件列表,其中特殊字符被通配符替换,分组并列出只有扩展名不同的地方。

$path = gci "somepath" -File -Recurse -ErrorAction Continue

$path|
Select @{l="Algorithm";e={}}, @{l="Hash";e={}}, @{l='File';e={$_.PSChildName}}, @{l='Compare Filename';e={$_.BaseName.replace('_','*').replace(' ','*').replace('-','*')}},  @{l="Path";e={$path + $_.PSParentPath.Substring(40,$_.PSParentPath.Length-40)}}, @{l="Link";e={$path +$_.FullName.substring(2,$_.FullName.Length-2)}}, @{l="Extension";e={$_.Extension}}|
group -Property 'Compare Filename'|
Where {@($_.Group.Extension |Sort -Unique).Count -ge 2}|
%{$_.group}|
Export-Csv -Path $CSV_path -NoTypeInformation

但是我在使用 .Count 方法时发现其中一个组没有按照我希望的方式导出。

如果我将部分代码用括号括起来并添加计数,就像这样

($path|
Select @{l="Algorithm";e={}}, @{l="Hash";e={}}, @{l='File';e={$_.PSChildName}}, @{l='Compare Filename';e={$_.BaseName.replace('_','*').replace(' ','*').replace('-','*')}},  @{l="Path";e={$path + $_.PSParentPath.Substring(40,$_.PSParentPath.Length-40)}}, @{l="Link";e={$path +$_.FullName.substring(2,$_.FullName.Length-2)}}, @{l="Extension";e={$_.Extension}}|
group -Property 'Compare Filename'|
Where {@($_.Group.Extension |Sort -Unique).Count -ge 2}).count

我在分别导出每个组后得到不同的值。

下面提到的罪魁祸首

File                                    Compare Filename                    Extension
MV_CHIK_202_ELISA_MEASLES_20180423.csv  MV*CHIK*202*ELISA*MEASLES*20180423  .csv
MV_CHIK_202_ELISA_MEASLES_20180423.xlsx MV*CHIK*202*ELISA*MEASLES*20180423  .xlsx
MV_CHIK_202_ELISA_MEASLES_20180423.csv  MV*CHIK*202*ELISA*MEASLES*20180423  .csv
MV_CHIK_202_ELISA_MEASLES_20180423.xlsx MV*CHIK*202*ELISA*MEASLES*20180423  .xlsx

如您所见,这 4 个文件应该在一个组中(基于 'compare filename' 属性),但是当整个列表通过管道传输到 %{$_.group} 时,得到的拆分结果条目数量不正确。在这种情况下, .count returns 值为 '42 ' 但 export-csv 产生 86 行(基本上意味着 43 组)。 关于如何增加计数值或合并上述组有什么想法吗?

尝试以与导出相同的方式计数。

($path|
Select @{l="Algorithm";e={}}, @{l="Hash";e={}}, @{l='File';e={$_.PSChildName}}, @{l='Compare Filename';e={$_.BaseName.replace('_','*').replace(' ','*').replace('-','*')}},  @{l="Path";e={$path + $_.PSParentPath.Substring(40,$_.PSParentPath.Length-40)}}, @{l="Link";e={$path +$_.FullName.substring(2,$_.FullName.Length-2)}}, @{l="Extension";e={$_.Extension}}|
group -Property 'Compare Filename'|
Where {@($_.Group.Extension |Sort -Unique).Count -ge 2}|
%{$_.count}).count

在对脚本的创建方式进行一些调查后,fileterd 的文件和

的输出
$path = gci "somepath" -File -Recurse -ErrorAction Continue

$path|
Select @{l="Algorithm";e={}}, @{l="Hash";e={}}, @{l='File';e={$_.PSChildName}}, @{l='Compare Filename';e={$_.BaseName.replace('_','*').replace(' ','*').replace('-','*')}},  @{l="Path";e={$path + $_.PSParentPath.Substring(40,$_.PSParentPath.Length-40)}}, @{l="Link";e={$path +$_.FullName.substring(2,$_.FullName.Length-2)}}, @{l="Extension";e={$_.Extension}}|
group -Property 'Compare Filename'|
Where {@($_.Group.Extension |Sort -Unique).Count -ge 2}

我开始意识到脚本完全按照它应该做的去做,而且实际上 csv 输出和分组对象数之间没有差异。纯属我的误会。

 Where {@($_.Group.Extension |Sort -Unique).Count -ge 2}

上面的行应该筛选组并包括那些至少存在两个扩展名的组。幸运的是,只有一组有两个以上的文件符合标准,因此我感到困惑。