PowerShell Export-Csv 使用 Split 方法保留前导零返回丢失的文件

问题描述 投票:0回答:1

理论上,现在“2023”文件夹中的所有文件名在文件名中具有相同数量的元素,我可以获取清单。 请参阅我之前的帖子以供参考顺便说一句,谢谢@mklement0,它说不要发表评论,谢谢,所以这是我的解决方法。

对于每个进程ID应该有4个文件。唯一的规则是 4 个文件或 4 的倍数,因为每个 计算机 id 可能有多个 进程 id 。应该有一个“xlsx”、两个“.msg”和一个“.png”,但情况并非总是如此,这是可以的。每当没有 4 个文件或 4 的倍数时,我需要根据 4 个国家/地区调出丢失的文件,因为这些文件是恒定的并且永远不会重复(当 computer idprocess id 组合时)。我想最大程度地减少在 excel 中执行的工作量,因为我需要为多个目录运行此脚本,这就是为什么我尝试在 PowerShell 中放入尽可能多的逻辑。

我根据“.”分割文件名并为每个创建一个列。我缺少前导 0 的代码(

process id)以及输出丢失文件的逻辑。我开始应用 RegEx,这可能更有效,但又恢复使用 Split 方法,因为我感到沮丧,并且仍然需要为 csv 文件创建标头。理由,绝对哈哈。我想学习如何在这种情况下使用 RegEx,并且需要继续深入研究 regex101。

#splitFile $numberedFolder = 'C:\Users\Documents\My Documents\PowerShell\Test' $outputFile = "C:\Users\Documents\My Documents\PowerShell\Results_$(Get-Date -f yyyy-MM-dd-hh-mm-ss).csv" Get-ChildItem -Directory -Recurse -LiteralPath $numberedFolder -Filter '2023' | Get-ChildItem -File | Select-Object @{name='computer id';Expression={$_.Name.Split('.')[0]}}, @{name='process id';Expression={ '{0:d3}' -f [int]$_.Name.Split('.')[1]}}, #trying to preverse leading 0's. will always be 3 digits long. @{name='computer name';Expression={$_.Name.Split('.')[2]}}, @{name='city';Expression={$_.Name.Split('.')[3]}}, @{name='country';Expression={$_.Name.Split('.')[4]}}, @{name='date';Expression={$_.Name.Split('.')[5]}}, @{name='file extension';Expression={$_.Name.Split('.')[6]}} | Export-Csv -Path $outputFIle -Append -NoTypeInformation
csv 文件中的当前输出

计算机 ID 进程ID计算机名称城市国家日期文件123451克里斯_comp墨西哥城墨西哥2023_08_20留言123451克里斯_comp米兰意大利2023_08_22png123451克里斯_comp纽约美国2023_08_22xlsx123451克里斯_comp多伦多加拿大2023_08_22留言123452克里斯_comp墨西哥城墨西哥2023_05_05留言123452克里斯_comp米兰意大利2023_05_05png123452克里斯_comp纽约美国2023_05_05xlsx123452克里斯_comp多伦多加拿大2023_05_05留言
我希望 csv 输出如下所示。

计算机 ID 进程ID计算机名称城市国家日期文件155551andrew_comp艾伯塔省加拿大2023_02_22留言155551andrew_comp华雷斯墨西哥2023_02_22留言155551andrew_comp纽约美国2023_02_22xlsx缺少 '15555.001' 的 'Italy' 文件 #'Italy' = 缺少 425671迈克_comp蒙特利尔加拿大2023_03_11留言425671迈克_comp坎昆墨西哥2023_03_12留言缺少“42567.001”的“USA”文件 #'USA' = 缺少 缺少 '42567.001' 的 'Italy' 文件 #'Italy' = 缺少
country 和 '15555.001' = 文件名的 computer id + process id 部分。
country 和 '42567.001' = 文件名的 computer id + process id 部分。
country 和 '42567.001' = 文件名的 computer id + process id 部分。
powershell get-childitem leading-zero export-csv
1个回答
0
投票
您可以按 ComputerId 和 ProcessID 进行分组,然后在

ForEach-Object

 循环中您可以检查丢失的国家/地区,如下所示:

#splitFile $numberedFolder = 'C:\Users\Documents\My Documents\PowerShell\Test' $outputFile = "C:\Users\Documents\My Documents\PowerShell\Results_$(Get-Date -f yyyy-MM-dd-hh-mm-ss).csv" Get-ChildItem -Directory -Recurse -LiteralPath $numberedFolder -Filter '2023' | Get-ChildItem -File | Select-Object @{name='computer id';Expression={$_.Name.Split('.')[0]}}, @{name='process id';Expression={ '{0:d3}' -f [int]$_.Name.Split('.')[1]}}, #trying to preverse leading 0's. will always be 3 digits long. @{name='computer name';Expression={$_.Name.Split('.')[2]}}, @{name='city';Expression={$_.Name.Split('.')[3]}}, @{name='country';Expression={$_.Name.Split('.')[4]}}, @{name='date';Expression={$_.Name.Split('.')[5]}}, @{name='file extension';Expression={$_.Name.Split('.')[6]}} | Group 'computer name','process id' -PipelineVariable 'Group'| ForEach-Object { # Pass all objects that exist $_.group # Check for missing objects, and create a 'Missing item' object for any missing ones If($_.Count -ne 4){ switch($_.group){ {'Mexico' -notin $_.Country}{[PSComputerObject]@{'Computer id'="Missing 'Mexico'"}} {'Canada' -notin $_.country}{[PSComputerObject]@{'computer id'="Missing 'Canada'"}} {'Italy' -notin $_.country}{[PSComputerObject]@{'computer id'="Missing 'Italy'"}} {'USA' -notin $_.country}{[PSComputerObject]@{'computer id'="Missing 'USA'"}} } # End Switch } # End If } | Export-Csv -Path $outputFIle -Append -NoTypeInformation
    
© www.soinside.com 2019 - 2024. All rights reserved.