我们有一个运行以下代码的活动:
$nr = $WorkflowData['_Number']
## Write to text
$nr>>C:\Configuration\nrFile.txt
基本上它会获得一个应添加到文件中的唯一编号。
问题是此活动在可以同时运行的多个工作流中运行。
这导致了很多错误,说nrFile.txt
是由同时运行的另一个作业打开的。
是否有某种方法可以同时从多个工作流程写入同一个文件?
或者也许以某种方式排队?
答案 0 :(得分:7)
您可以使用Mutex同步文件访问权限,例如
$mutex = new-object System.Threading.Mutex $false,'SomeUniqueName'
...
nr = $WorkflowData['_Number']
$mutex.WaitOne() > $null
$nr >> C:\Configuration\nrFile.txt
$mutex.ReleaseMutex()
答案 1 :(得分:1)
您可以在多个作业尝试访问该文件或工作流程中的多个活动之间进行切换。作业被隔离到单独的进程中,因此某些争用防止机制不适用。工作流程在同一个流程中运行,因此这些方法在这种情况下可能是合适的。
它不是很迷人,但是一个基本的“如果一开始你没有成功,尝试,再试一次”的方法通常完全适合这样的事情。
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
修改强> 以前错误地声称命名互斥(基思的方法)不能在进程间工作。