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. Install Nvidia driver 367.18 or later

    Install Nvidia driver 367.18 or later from ppa:graphics-drivers/ppa as follows: sudo add-apt-reposit ...

  2. codeforces 754D. Fedor and coupons

    D. Fedor and coupons time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  3. 使用rem来开发你的移动端网站

    what is rem ? )css3中的计量元素大小的单位,类似px.pt.em. )一种相对根元素font-size的计算方式.1rem = <html>'s font-size px ...

  4. 关于margin的一些问题

    引 在平时处理样式的过程中,会出现各种问题.比如: 包含在父元素中的子元素设置了浮动,子元素高度变化的时候父元素的高度没有随着变化,就是没有被撑高,父元素仍然是原来设置的那个高度 包含在父元素中的子元 ...

  5. 动态代理proxy与CGLib的区别

    什么是代理? 静态代理与动态代理 静态代理实例 JDK动态代理实例 CGLib 简介 CGLib 与JDK动态代理的区别 代理模式是Java中常见的一种模式,英文名字叫走Proxy或者Surrogat ...

  6. eclipse中mybatis_generator插件的安装与使用

    git地址:https://github.com/mybatis/generator 下载后解压: 选择任意一个版本的jar放到eclipse的features目录下即可 选择任意一个版本的jar放到 ...

  7. Linux新建用户并添加到sudo组

    原文参考链接:https://www.douban.com/note/338488349/ 以在kali 下添加一个test用户为例: Step1#:添加新用户useradd -r -m -s /bi ...

  8. STM32命名原则

    每种STM32的产品都由16个字母或数字构成的编号标示,用户向ST订货时必须使用这个编号指定需要的产品.这16个字符分为8个部分,下面通过一个例子说明它们的意义: STM32  F   103  C ...

  9. Java 文本文件 读写

    Use File/FileInputStream/FileOutputStream. public void testWithFIS() throws IOException{ File file=n ...

  10. String根据、拆分

    String cla="信1305.信1304.信1204.信1103.信1403"; while(cla.contains(".")){ int a=cla. ...