Eu tenho o seguinte script que executo no 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
No entanto, ao executar o script, geralmente recebo o erro,
Out-File: The process cannot access the file
Obviamente, isso ocorre porque dois ou mais processos paralelos estão tentando escrever o mesmo arquivo de saída ao mesmo tempo (ele roda bem sem -Parallel
).
Minha pergunta é: existe uma maneira de dizer ao processo para continuar tentando gravar no arquivo de saída até que seja bem-sucedido, em vez de postar uma mensagem de erro e seguir em frente. Imagino que haja algo em uma solução try-catch, mas não estou familiarizado com try-catch e postagem de erros no PowerShell.
Desde já agradeço sua orientação.
O Powershell diferencia entre erros de finalização e não finalização. Erros que não terminam não são detectados por
try {}
, portanto, a solução depende da natureza do erro.Para encerrar erros , use:
Para obter mais informações, consulte o artigo Manipulando erros com o comando try-catch do PowerShell .
Para erros que não terminam , use o
-ErrorAction
parâmetro.As ações de erro são descritas em detalhes em:
Para serializar corretamente as ações para que nenhum conflito surja, use Mutexes .
Um exemplo é:
Para obter mais informações, consulte o artigo
Using Mutexes to Write Data to the Same Logfile Across Process With PowerShell .