我很確定答案是否定的,但它一直困擾著我。
我的任務是遞回地在特定位置查找重復檔案。我可以毫無問題地做到這一點。但是看到某些檔案有 3 或 4 個重復項,我無法回答“有多少檔案是原始檔案?”的問題。無需求助于 excel 編輯。
代碼:
gci -path $path -recurse -file -erroraction silentlycontinue|
Select @{l='Original Filename';e={$_.PSChildName}}, @{l='Compare Filename';e={$_.BaseName.replace('_','*').replace(' ','*').replace('-','*')}}, @{l="Path";e={$_.PSParentPath.Substring(38,$_.PSParentPath.Length-38)}}, @{l="Link";e={$_.FullName}}|
group -Property 'Compare Filename'|
Where {$_.count -ge 2}|
%{$_.group}|
Export-Csv -Path $path2 -NoTypeInformation
路徑變數無關緊要,所以我不會列出它們。
uj5u.com熱心網友回復:
要可靠地計算輸出的組(Microsoft.PowerShell.Commands.GroupInfo實體)的數量Group-Object,請使用以下任一方法:
- 根據zett42 的建議,基于管道;雖然相對較慢,但這會導致不需要首先在記憶體中收集所有輸出的流處理
Group-Object:
(1, 1, 1 | Group-Object | Measure-Object).Count # -> 1 (group)
- 簡潔,基于表達,正如Lee Dailey所建議的那樣;請注意,這涉及首先收集記憶體中的所有輸出物件:
@(1, 1, 1 | Group-Object).Count # -> 1 (group)
# Alternative, using .Length
(1, 1, 1 | Group-Object).Length # -> 1 (group)
筆記:
要計算所有原始(非重復)物件,即屬于它們自己的一組物件,只需添加
| Where-Object Count -eq 1到Group-Object上面即可。使用
@()中,陣列子運算式運算子,在這種情況下關鍵的:它可以確保Group-Object輸出被認為是一個陣列,即使只有一個單一組恰好是輸出。- 這確保查詢的是陣列的
.Count屬性,而不是單個GroupInfo實體自己的.Count屬性 - 這反映了組成員的數量,并且3在上面的示例中 (try(1, 1, 1 | Group-Object).Count)。
- 這確保查詢的是陣列的
或者,使用
.Length而不是.Count繞過這種命名沖突:.Length和.Count是彼此的別名,并且即使在標量(單個物件)上也作為內在屬性提供,作為PowerShell中標量和集合統一處理的一部分:也就是說,PowerShell 提供了甚至具有指示該物件計數的/屬性的任何單個物件,根據定義,該計數是-除非被同名的型別本機屬性搶占。.Length.Count1.Length因此,固有屬性按預期作業,因為它GroupInfo沒有.Length屬性。可以使用字串標量演示相反的場景:
'foo'.Lengthis3-.Length反映字符計數的型別本機屬性的值- 而'foo'.Countis1-.Count“計數”單個物件的內在屬性。
在管道解決方案中,
Measure-Object由于管道的列舉行為,不會出現問題的解決方案:然而,許多物件的Group-Object輸出通過管道一個一個地發送,并對其進行Measure-Object計數 - 在這種情況下,型別本機.Count屬性的值始終 輸出的單個Microsoft.PowerShell.Commands.GenericMeasureInfo實體是感興趣的值。Measure-Object
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/390715.html
