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同时只能运行一个脚本(进程互斥例子)的更多相关文章

  1. 同一个PC只能运行一个应用实例(考虑多个用户会话情况)

    原文:同一个PC只能运行一个应用实例(考虑多个用户会话情况) class Program { private static Mutex m; [STAThread] static void Main( ...

  2. C# WINFORM判断程序是否运行,且只能运行一个实例(转)

    判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种, 方法1:线程互斥 static class Program { private static System.Threading. ...

  3. winform判断程序是否运行,且只能运行一个实例

    前言 判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种. 目前使用的是第一种方法. 方法1:线程互斥 static class Program { private static S ...

  4. Qt之运行一个实例进程

    简述 发布程序的时候,我们往往会遇到这种情况: 只需要用户运行一个实例进程 用户可以同时运行多个实例进程 一个实例进程的软件有很多,例如:360.酷狗- 多个实例进程的软件也很多,例如:Visual ...

  5. 让程序同时只能运行一个C++ Builder实现(转)

    源:让程序同时只能运行一个 很多人都讨论过这个问题, 这里用Victor串口控件里面现成的共享内存功能来实现. 当程序运行第二次时只是激活第一次运行的窗口, 而不是再运行一个程序. 需要在主程序里实现 ...

  6. 通过使用Web Workers,Web应用程序可以在独立于主线程的后台线程中,运行一个脚本操作。这样做的好处是可以在独立线程中执行费时的处理任务,从而允许主线程(通常是UI线程)不会因此被阻塞/放慢。

    Web Workers API - Web API 接口参考 | MDNhttps://developer.mozilla.org/zh-CN/docs/Web/API/Web_Workers_API ...

  7. kubernetes 每个node上只能运行一个副本DaemonSet

    每个node上只能运行一个副本: apiVersion: extensions/v1beta1 kind: DaemonSet #使用DaemonSet的方式运行 metadata: name: ku ...

  8. 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.网络监听配置 ...

  9. 如何用Qt写一个同一时间只能运行一个实例的应用程序

    http://blog.sina.com.cn/s/blog_6343941a0100nk2x.html 可以达到的目的: 1.应用只启动一个实例,依赖于QtNetwork模块 2.启动时向另一个实例 ...

随机推荐

  1. 小谈 checkbox 的选中

    先做草稿,稍后完善, javascript for (var i = 0; i < jsonmsg.length; i++) { var ischecked = false; for (var ...

  2. 修改 phpmyadmin 创建数据库默认编码

    phpmyadmin 创建数据库的默认编码是:latin1_swedish_ci 修改默认编码的方法是 1.登录phpmyadmin 2.在导航部分点:变量 3.Ctrl+F 查找:latin1_sw ...

  3. HTML5 Canvas一些常用的操作

    粗略的Canvas API 1. context var context = canvas.getContext('2d'); 2.Canvas state context.save();//将当前状 ...

  4. Linux 命令——grep | 正则表达式

    感觉讲的很详细,瞬间懂了grep,正则. from: here 简介 grep (global search regular expression(RE) and print out the line ...

  5. 自定义view--实现滑动

    1.重写 onInterceptTouchEvent() 拦截触摸事件 是由父控件向子控件传递 默认返回false 返回true,事件被当前的viewGroup进行处理,Touch事件不向下(子控件) ...

  6. 反射(Reflection)

    反射主要用于在程序运行期间动态解析相关类的类名,命名空间,属性,方法并进行相应操作,以下通过两个简单的例子进行了说明: 示例1:调用程序集内部方法,运行时动态获取相关类的信息,包括类名,命名空间等信息 ...

  7. PBS 安装

    How to install PBS Pro using the configure script. . Install the prerequisite packages for building ...

  8. 关于UIView的AutoresizingMask属性的研究

    在 UIView 中有一个autoresizingMask的属性,它对应的是一个枚举的值(如下),属性的意思就是自动调整子控件与父控件中间的位置,宽高. 1 2 3 4 5 6 7 8 9 enum  ...

  9. 命令行导入mysql数据

    找到mysql安装目录(bin) 进入mysql mysql -u root -p 123 选中数据库 use 数据库名 导入sql  source sql数据库路径

  10. Scrapy--1安装和运行

    1.Scrapy安装问题 一开始是按照官方文档上直接用pip安装的,创建项目的时候并没有报错, 然而在运行 scrapy crawl dmoz 的时候错误百粗/(ㄒoㄒ)/~~比如: ImportEr ...