Windows 在PowerShell中写入包含多个作业的文件

Windows 在PowerShell中写入包含多个作业的文件,windows,powershell,parallel-processing,Windows,Powershell,Parallel Processing,我们有一个运行以下代码的活动: $nr=$WorkflowData[''u编号'] ##写入文本 $nr>>C:\Configuration\nrFile.txt 基本上,它得到一个唯一的数字,应该添加到一个文件中。 问题是此活动在多个可以同时运行的工作流中运行。 这导致了很多错误,例如,nrFile.txt被同时运行的另一个作业打开 是否有某种方法可以同时将多个工作流写入同一文件 或者以某种方式将它们排队?您可以使用互斥锁同步文件访问,例如 $mutex = new-object Syste

我们有一个运行以下代码的活动:

$nr=$WorkflowData[''u编号']
##写入文本
$nr>>C:\Configuration\nrFile.txt
基本上,它得到一个唯一的数字,应该添加到一个文件中。 问题是此活动在多个可以同时运行的工作流中运行。 这导致了很多错误,例如,
nrFile.txt
被同时运行的另一个作业打开

是否有某种方法可以同时将多个工作流写入同一文件


或者以某种方式将它们排队?

您可以使用互斥锁同步文件访问,例如

$mutex = new-object System.Threading.Mutex $false,'SomeUniqueName'
...
nr = $WorkflowData['_Number']
$mutex.WaitOne() > $null
$nr >> C:\Configuration\nrFile.txt
$mutex.ReleaseMutex()

您可以选择说多个作业试图访问文件,或者说工作流中的多个活动。作业被隔离到单独的进程中,因此某些争用预防机制不适用。工作流在同一流程中运行,因此在这种情况下,这些方法可能是合适的

这并不吸引人,但一个基本的“如果一开始你没有成功,尝试,再试一次”的方法通常对这样的事情来说是完全足够的

filter append
{
   param(
       [Parameter(Mandatory = $true, ValueFromPipeline = $true)][string[]] $line,
       [Parameter(Mandatory = $true, Position = 0)][string] $path
   )

   $done = $false
   while(-not $done)
   {
       try{ $line | out-file $path -append -ea Stop }
       catch { sleep 1; continue }
       $done = $true
   }
}

$nr | append C:\Configuration\nrFile.txt
编辑
以前错误地断言命名互斥体(Keith的方法)在进程间不起作用。

互斥体在进程间起作用。事实上,这是他们的主要目的。也许你正在考虑监视器或信号灯。尝试从两个不同的PowerShell控制台使用互斥锁(同名)。只要控制台是STA(而不是MTA),就可以正常工作。我的观点是正确的。未命名的互斥体不能跨进程工作,但命名的互斥体(如您的示例)可以跨进程工作。谢谢你指出我的错误,我已经编辑了我的答案。不用担心。我不想数一数我不得不对其进行的更正次数,所以::-)我使用这种技术来同步对IIS配置的访问,以允许我们同时运行多个部署脚本,并避免可怕的“无法提交配置更改,因为文件已在磁盘上更改”效果非常好!我将此应用于PowerShell 5.1和PowerShell 7。