有多個作業文件,我們有運行下面的代碼的活動:寫在PowerShell中
$nr = $WorkflowData['_Number']
## Write to text
$nr>>C:\Configuration\nrFile.txt
基本上它得到了應添加到文件的唯一編號。 問題是,此活動在可以同時運行的多個工作流程中運行。 這導致了很多錯誤,說明nrFile.txt
由另一個同時運行的作業打開。
是否有一些方法可以將多個工作流同時寫入同一文件?
或者也許排隊他們?
有多個作業文件,我們有運行下面的代碼的活動:寫在PowerShell中
$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
編輯 此前錯誤地斷言命名的互斥體(Keith的方式)不起作用進程間。
Mutexes跨進程工作。事實上,這是他們的主要目的。也許你正在考慮顯示器或信號量。從兩個不同的PowerShell控制檯嘗試互斥(同名)。只要控制檯是STA(而不是MTA)就可以工作。 –
我站好了。未命名的互斥體不適用於跨進程,但命名的互斥體(如您的示例)可以。感謝您指出我的錯誤,我編輯了我的答案。 – latkin
不用擔心。我不想計算我在SO上所做的更正次數。 :-) –
非常感謝Keith,這個工作非常完美。 – Aldu
我已經使用這種技術來同步對IIS配置的訪問,以允許我們同時運行多個部署腳本並避免可怕的「無法提交配置更改,因爲文件在磁盤上已更改」 –