【发布时间】:2021-10-19 20:19:54
【问题描述】:
这是How to exit from ForEach-Object in PowerShell 的副本 - 我不知道如何标记它,但我再次问这个问题,因为该问题的答案中有大量有用的信息,包括处理它的方法。然而,从 2012 年开始接受的答案似乎并不正确,智慧的金块被埋葬了,不应该被埋葬。
所以我的脚本循环遍历目录中的所有 CSV 文件,然后对包含列数错误的记录的那些文件执行操作。当我第一次运行它时,它花了很长时间,我意识到一些 CSV 实际上对所有行都有正确的列数,我不需要对它们采取行动,所以我决定尝试实现一些东西来检查至少一行列数不正确,然后对文件采取某种措施。为此,我需要在找到符合条件的行后退出 ForEach-Object 循环。
这是原始脚本:
$ParentPath = "C:\Users\<username>\Documents\Temporary\*"
$Files = Get-ChildItem -Path $ParentPath -Include *.csv
foreach ($File in $Files) {
$OldPath = $File | % { $_.FullName }
$OldContent = Get-Content $OldPath
$NewContent = $OldContent |
Where-Object {$_.split(",").Count -eq 11}
Set-Content -Path "$(Split-Path $OldPath)\$($File.BaseName).txt" -Value $NewContent
}
对文件实施某种类型的“预检查”证明很困难,即使我能够使用an answer from SO 正确写出“坏行”——我无法退出 ForEach-Object循环而不处理所有行(从而破坏了预先检查文件是否存在违规行的整个目的)。
下面的代码非常适合识别第一个坏行,如果您删除 ;break,那么它会写出每个违规行:
Get-Content $OldPath | ?{$_} | %{if(!($_.split(",").Count -eq 11)){"Process stopped at line number $($_.ReadCount), incorrect column count of: $($_.split(",").Count).";break}}
那么我如何结合这两个脚本来预先检查文件中是否存在违规行,然后对需要它的文件采取措施?请参阅下面的建议答案!
【问题讨论】:
标签: powershell