我们有一个运行以下代码的活动:
$nr = $WorkflowData['_Number']
## Write to text
$nr>>C:\Configuration\nrFile.txt
基本上,它会获得一个唯一的编号,应该将其添加到文件中。问题是这个活动在多个可以同时运行的工作流中运行。这导致了很多错误,说它nrFile.txt
是由同时运行的另一个作业打开的。
有没有办法同时从多个工作流写入同一个文件?
或者也许以某种方式将它们排队?
我们有一个运行以下代码的活动:
$nr = $WorkflowData['_Number']
## Write to text
$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
编辑 以前错误地断言命名互斥锁(基思的方法)在进程间不起作用。