Contents

PowerShell 防止同時執行程式(使用Mutex)

平常我們很常寫程式都會設主程式,會有同時執行 Issue。這邊最近找到用 PowerShell 防止同時執行方法,但後來還是遇到一些問題,所以就不使用了。

第一次用的人需要開權限

請參考: PowerShell 更改執行原則,解決無法執行 ps1 指令稿問題 - Office 指南

1
Set-ExecutionPolicy RemoteSigned

使用 Mutex

參考:讓powershell同時只能運行一個腳本(進程互斥例子) - PowerShell免費軟件 - 博客園

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# PowerShell 進程(腳本)互斥的例子
$互斥名字 = 'Global\我代號為天王蓋地虎'
$建立互斥成功否 = $flase
$互斥對象 = New-Object System.Threading.Mutex ($true,$互斥名字,[ref]$建立互斥成功否)
if ($建立互斥成功否)
{
    write-host '互斥成功,開始幹活!'
    start-sleep  -Seconds 60 #你的任務
    $互斥對象.ReleaseMutex() | Out-Null
    $互斥對象.Dispose() | Out-Null
    write-host '活幹完了,釋放'
}
else
{
# 每個互斥腳本必須單獨佔用一個進程!powershell傳教士 win7 ,win10, powershell core v6.0 beta8 on linux測試通過
    write-host '互斥失敗 !'
}

後續我沒有使用這個方法

我發現我寫在我動態排程啟動器,發現執行第一次後,後續不一定次數後 Mutex 功能會失效,得到資訊都會是 false。這邊就不使用這個方法。至於發生什麼問題我還沒找到原因,但我猜是鎖壞掉了,可能沒解鎖到。

Linux 是否也能使用?

我使用 Multipass 用虛擬 Ubuntu 安裝 PowerShell 試試看。這邊我估計是可行的。
之前 Switch Lan play 模擬區往連線遊玩 - 程式狂想筆記 - 記錄著我接觸程式藝文 就有玩過 Multipass ,所以就決定用這個簡單做測試。

安裝 Multipass 啟動虛擬機

1
2
# 安裝 multipass
sudo snap install multipass
1
2
multipass launch --name foo
multipass shell foo

安裝 PowerShell

參考: 在 Ubuntu 上安裝 PowerShell - PowerShell | Microsoft Learn

這邊注意下面指令可以要分開複製執行喔

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Update the list of packages
sudo apt-get update
# Install pre-requisite packages.
sudo apt-get install -y wget apt-transport-https software-properties-common
# Download the Microsoft repository GPG keys
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
# Register the Microsoft repository GPG keys
sudo dpkg -i packages-microsoft-prod.deb
# Update the list of packages after we added packages.microsoft.com
sudo apt-get update
# Install PowerShell
sudo apt-get install -y powershell
# Start PowerShell
pwsh

或參考離線安裝

可以簡單確定是否能執行。
https://i.imgur.com/NndWdmD.png

複製檔案到 Ubutnu 主機

1
scp .\test.ps1 {user}@192.168.1.118:.

詳細可以看Windows 10 - PowerShell - 使用 scp 复制文件到 CentOS 7_土拨鼠啊啊啊的博客-CSDN博客_powershell scp

檔案傳到虛擬機

參考: multipass transfer command | Multipass documentation

1
multipass transfer test.ps1  foo:. 

執行測試

https://i.imgur.com/5KxZQ9m.png

果然可以進行執行。當初怕這種東西可能無法用在跨平台,沒想到竟然可以,看來是我的多想。

相關文章