PowerShell免费软件

让powershell同时只能运行一个脚本(进程互斥例子)

powershell,mutex,互斥,进程互斥,脚本互斥

powershell脚本互斥例子,在powershell类别文章中,声明原创唯一。

powershell 传教士 原创文章 2016-07-02 ,2017-10-10 更新。允许转载,但必须保留名字和出处,否则追究法律责任

---【前言】---

        有时候我们希望脚本并发,用多进程、多线程尽快地跑。也有时我们希望同时只能运行一个脚本。

linux中bash的做法是,脚本先检测特定文件,没有就建立这个文件,并运行。运行完后就删除。 这种方法对于powershell来说已经out了,老奶奶了。这个方法有两个弊端:

1 是慢,内存速度是磁盘文件的1000左右倍。

2 如果脚本非正常终止,没有删除特定文件,那么下一次脚本将无法运行。

而。net(powershell)给我们提供了【内存中的】特定值,就是用System.Threading.Mutex类,来让powershell脚本享受二进制程序相同的待遇。

当然,我感觉还是有点不完美,即这个值是基于进程,而不是基于脚本。

 

---【脚本调用时的注意事项】---

        正由于这个弊端,所以我们要在cmd中,这样调用脚本:

powershell -file mutex_powershell进程互斥例子.ps1

单开一个进程然后再调用,在powershell中调用脚本也是这样。 当然也可以用start-process调用。就是不能直接调用。

假设你直接调用:

开两个powershell进程。在powershell_a中运行这个脚本,把powershell_a进程注册成了唯一。 再在powershell_b中再运行这个脚本,将永远显示“互斥失败”。那是因为,即使powershell_a中的脚本运行结束了,但powershell_a这个进程还没结束。

 

---【猪懂傻改 脚本例子】---

复制代码
# 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 '互斥失败 !'
}
复制代码

 

谢谢看帖,完。

 

posted on   PowerShell免费软件  阅读(2026)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示