我有在 PS 7.2.0-preview.1 中运行的以下脚本:
get-childitem *.* -File -recurse | foreach-object -parallel {$hashX=(get-filehash -algorithm sha256 $_); $hash=@{sha256=$hashX.Hash; path=$hashX.Path}; write-output "$($hash.path)`t$($hash.sha256)" >> d:\g-SATA-hash.txt} -throttle 8
但是,运行脚本时,我经常会收到错误,
Out-File: The process cannot access the file
显然,发生这种情况的原因是两个或多个并行进程试图同时写入同一个输出文件(没有 也可以正常运行-Parallel
)。
我的问题是,有没有办法告诉进程继续尝试写入输出文件直到成功,而不是发布错误消息并继续前进。我想象 try-catch 解决方案中有一些东西,但我不熟悉 PowerShell 中的 try-catch 和错误发布。
提前感谢您的指导。
答案1
Powershell 区分终止错误和非终止错误。非终止错误不会被捕获try {}
,因此解决方案取决于错误的性质。
为了终止错误, 使用:
try
{
...tested action...
}
catch
{
...catch action...
}
更多信息请参阅文章 使用 PowerShell try-catch 命令处理错误。
为了非终止错误,而是使用-ErrorAction
参数。
错误操作在以下位置有详细描述:
对于正确序列化动作为了不发生冲突,使用 互斥锁。
一个例子是:
$mutex = new-object System.Threading.Mutex $false,'SomeUniqueName'
...
nr = $WorkflowData['_Number']
$mutex.WaitOne() > $null
$nr >> C:\Configuration\nrFile.txt
$mutex.ReleaseMutex()
更多信息请参阅文章
使用互斥锁通过 PowerShell 将数据写入跨进程的同一日志文件。