理论上,现在“2023”文件夹中的所有文件名在文件名中具有相同数量的元素,我可以获取清单。 请参阅我之前的帖子以供参考顺便说一句,谢谢@mklement0,它说不要发表评论,谢谢,所以这是我的解决方法。
对于每个进程ID,应该有4个文件。唯一的规则是 4 个文件或 4 的倍数,因为每个 计算机 id 可能有多个 进程 id 。应该有一个“xlsx”、两个“.msg”和一个“.png”,但情况并非总是如此,这是可以的。每当没有 4 个文件或 4 的倍数时,我需要根据 4 个国家/地区调出丢失的文件,因为这些文件是恒定的并且永远不会重复(当 computer id 和 process 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 文件中的当前输出
country 和 '15555.001' = 文件名的 computer id + process id 部分。 | ||||||
country 和 '42567.001' = 文件名的 computer id + process id 部分。 | ||||||
country 和 '42567.001' = 文件名的 computer id + process id 部分。 |
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