2013-08-06 40 views
3

有多個作業文件,我們有運行下面的代碼的活動:寫在PowerShell中

$nr = $WorkflowData['_Number'] 

## Write to text 
$nr>>C:\Configuration\nrFile.txt 

基本上它得到了應添加到文件的唯一編號。 問題是,此活動在可以同時運行的多個工作流程中運行。 這導致了很多錯誤,說明nrFile.txt由另一個同時運行的作業打開。

是否有一些方法可以將多個工作流同時寫入同一文件?

或者也許排隊他們?

回答

5

您可以使用互斥鎖同步文件訪問,例如,說多工作之間

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

非常感謝Keith,這個工作非常完美。 – Aldu

+0

我已經使用這種技術來同步對IIS配置的訪問,以允許我們同時運行多個部署腳本並避免可怕的「無法提交配置更改,因爲文件在磁盤上已更改」 –

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 

編輯 此前錯誤地斷言命名的互斥體(Keith的方式)不起作用進程間。

+2

Mutexes跨進程工作。事實上,這是他們的主要目的。也許你正在考慮顯示器或信號量。從兩個不同的PowerShell控制檯嘗試互斥(同名)。只要控制檯是STA(而不是MTA)就可以工作。 –

+0

我站好了。未命名的互斥體不適用於跨進程,但命名的互斥體(如您的示例)可以。感謝您指出我的錯誤,我編輯了我的答案。 – latkin

+0

不用擔心。我不想計算我在SO上所做的更正次數。 :-) –