让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 '互斥失败 !'
}
谢谢看帖,完。
让powershell同时只能运行一个脚本(进程互斥例子)的更多相关文章
- 同一个PC只能运行一个应用实例(考虑多个用户会话情况)
原文:同一个PC只能运行一个应用实例(考虑多个用户会话情况) class Program { private static Mutex m; [STAThread] static void Main( ...
- C# WINFORM判断程序是否运行,且只能运行一个实例(转)
判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种, 方法1:线程互斥 static class Program { private static System.Threading. ...
- winform判断程序是否运行,且只能运行一个实例
前言 判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种. 目前使用的是第一种方法. 方法1:线程互斥 static class Program { private static S ...
- Qt之运行一个实例进程
简述 发布程序的时候,我们往往会遇到这种情况: 只需要用户运行一个实例进程 用户可以同时运行多个实例进程 一个实例进程的软件有很多,例如:360.酷狗- 多个实例进程的软件也很多,例如:Visual ...
- 让程序同时只能运行一个C++ Builder实现(转)
源:让程序同时只能运行一个 很多人都讨论过这个问题, 这里用Victor串口控件里面现成的共享内存功能来实现. 当程序运行第二次时只是激活第一次运行的窗口, 而不是再运行一个程序. 需要在主程序里实现 ...
- 通过使用Web Workers,Web应用程序可以在独立于主线程的后台线程中,运行一个脚本操作。这样做的好处是可以在独立线程中执行费时的处理任务,从而允许主线程(通常是UI线程)不会因此被阻塞/放慢。
Web Workers API - Web API 接口参考 | MDNhttps://developer.mozilla.org/zh-CN/docs/Web/API/Web_Workers_API ...
- kubernetes 每个node上只能运行一个副本DaemonSet
每个node上只能运行一个副本: apiVersion: extensions/v1beta1 kind: DaemonSet #使用DaemonSet的方式运行 metadata: name: ku ...
- Oracle 远程访问配置 在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标 C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素” C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作
Oracle 远程访问配置 服务端配置 如果不想自己写,可以通过 Net Manager 来配置. 以下配置文件中的 localhost 改为 ip 地址,否则,远程不能访问. 1.网络监听配置 ...
- 如何用Qt写一个同一时间只能运行一个实例的应用程序
http://blog.sina.com.cn/s/blog_6343941a0100nk2x.html 可以达到的目的: 1.应用只启动一个实例,依赖于QtNetwork模块 2.启动时向另一个实例 ...
随机推荐
- php 资源
ThinkPHP http://www.thinkphp.cn/ 小案例 http://www.helloweba.com/php.html Github上的PHP资源汇总大全 http://www. ...
- python走起之第十一话
Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...
- MFC编程入门之十八(对话框:字体对话框)
在上一节为大家讲解了文件对话框的使用,本节则主要介绍字体对话框如何应用. 字体对话框的作用是用来选择字体.我们也经常能够见到.MFC使用CFontDialog类封装了字体对话框的所有操作.字体对话框也 ...
- 启动受管服务器出现:unable to get file lock, will retry...
启动受管服务器出现:unable to get file lock, will retry... 解决方法:一.删掉Domain下的*.lok文件1. 删除edit.lok进入到domain_home ...
- PBOC金融IC卡,卡片与终端交互的13个步骤,简介-第四组(转)
十:联机处理-可选项终端根据卡片行为分析的结果,执行对应的处理.若卡片响应联机,则终端发起联机操作.联机处理使得发卡行后台可以根据基于后台的风险管理参数检查并授权批准或拒绝交易.除了传统的联机欺诈和信 ...
- 分布式消息队列 Kafka
分布式消息队列 Kafka 2016-02-25 杜亦舒 Kafka是一个高吞吐量的.分布式的消息系统,由Linkedin开发,开发语言为scala具有高吞吐.可扩展.分布式等特点 适用场景 活动数据 ...
- VB用windows API激活子窗体
http://files.cnblogs.com/files/liuzhaoyzz/%E6%BF%80%E6%B4%BB%E5%AD%90%E7%AA%97%E4%BD%93.rar setforeg ...
- HTML5 十大新特性(三)——视频和音频
一.视频(video) H5新加了video标签,用来播放视频,默认为一个300*150的inline-block. 二.音频(audio) H5新加了audio标签,用来播放音频,默认为一个300* ...
- SAP 设置屏幕字段的隐藏、显示、必填和可选,以设置物料组为例
1.事务码MM01,把物料组设为选填字段. 2.找到物料组的屏幕字段. 3.在后台根据屏幕字段找到对应字段组.后台路径:后勤-常规—物料主数据—字段选择—给字段组分配字段.点击后面的箭头进入下一屏幕. ...
- linux rpm -ivh MySQL-server-5.5.31-2.el6.i686.rpm
linux rpm 安装mysql异常: [root@localhost upload]# rpm -ivh MySQL-server-5.5.31-2.el6.i686.rpmerror: Fail ...