让powershell同时只能运行一个脚本(进程互斥例子)
powershell,mutex,互斥,進(jìn)程互斥,腳本互斥
powershell腳本互斥例子,在powershell類別文章中,聲明原創(chuàng)唯一。
powershell 傳教士 原創(chuàng)文章 2016-07-02 ,2017-10-10?更新。允許轉(zhuǎn)載,但必須保留名字和出處,否則追究法律責(zé)任
---【前言】---
??????? 有時(shí)候我們希望腳本并發(fā),用多進(jìn)程、多線程盡快地跑。也有時(shí)我們希望同時(shí)只能運(yùn)行一個(gè)腳本。
linux中bash的做法是,腳本先檢測特定文件,沒有就建立這個(gè)文件,并運(yùn)行。運(yùn)行完后就刪除。 這種方法對(duì)于powershell來說已經(jīng)out了,老奶奶了。這個(gè)方法有兩個(gè)弊端:
1 是慢,內(nèi)存速度是磁盤文件的1000左右倍。
2 如果腳本非正常終止,沒有刪除特定文件,那么下一次腳本將無法運(yùn)行。
而。net(powershell)給我們提供了【內(nèi)存中的】特定值,就是用System.Threading.Mutex類,來讓powershell腳本享受二進(jìn)制程序相同的待遇。
當(dāng)然,我感覺還是有點(diǎn)不完美,即這個(gè)值是基于進(jìn)程,而不是基于腳本。
?
---【腳本調(diào)用時(shí)的注意事項(xiàng)】---
??????? 正由于這個(gè)弊端,所以我們要在cmd中,這樣調(diào)用腳本:
powershell -file mutex_powershell進(jìn)程互斥例子.ps1
即單開一個(gè)進(jìn)程然后再調(diào)用,在powershell中調(diào)用腳本也是這樣。 當(dāng)然也可以用start-process調(diào)用。就是不能直接調(diào)用。
假設(shè)你直接調(diào)用:
開兩個(gè)powershell進(jìn)程。在powershell_a中運(yùn)行這個(gè)腳本,把powershell_a進(jìn)程注冊成了唯一。 再在powershell_b中再運(yùn)行這個(gè)腳本,將永遠(yuǎn)顯示“互斥失敗”。那是因?yàn)?即使powershell_a中的腳本運(yùn)行結(jié)束了,但powershell_a這個(gè)進(jìn)程還沒結(jié)束。
?
---【豬懂傻改 腳本例子】---
# PowerShell 進(jìn)程(腳本)互斥的例子 $互斥名字 = 'Global\我代號(hào)為天王蓋地虎' $建立互斥成功否 = $flase $互斥對(duì)象 = New-Object System.Threading.Mutex ($true,$互斥名字,[ref]$建立互斥成功否) if ($建立互斥成功否) {write-host '互斥成功,開始干活!'start-sleep -Seconds 60 #你的任務(wù)$互斥對(duì)象.ReleaseMutex() | Out-Null$互斥對(duì)象.Dispose() | Out-Nullwrite-host '活干完了,釋放' } else { #?每個(gè)互斥腳本必須單獨(dú)占用一個(gè)進(jìn)程!powershell傳教士 win7 ,win10,?powershell core v6.0 beta8 on linux測試通過write-host '互斥失敗 !' }?
謝謝看帖,完。
?
轉(zhuǎn)載于:https://www.cnblogs.com/piapia/p/5647205.html
總結(jié)
以上是生活随笔為你收集整理的让powershell同时只能运行一个脚本(进程互斥例子)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ArcObject开发时,axtoolb
- 下一篇: 给大忙人看的Java核心技术笔记(8、S