平常我們很常寫程式都會設主程式,會有同時執行 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
|
或參考離線安裝
可以簡單確定是否能執行。
複製檔案到 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:.
|
執行測試
果然可以進行執行。當初怕這種東西可能無法用在跨平台,沒想到竟然可以,看來是我的多想。
相關文章