如何确保一次只运行一个脚本实例?

时间:2010-12-24 16:32:25

标签: powershell powershell-v2.0

假设我启动了一个powershell脚本并且它在循环中运行。 我打开第二个ps控制台并启动第二个脚本。在这个脚本中,我想检测第一个脚本是否正在运行。 有什么方法可以达到这个目的?

3 个答案:

答案 0 :(得分:4)

如果您正在查看打开2个单独的控制台,则需要在脚本中添加一些逻辑,以对文件系统,注册表甚至PowerShell会话的标题栏进行一些更改。然后,您可以在第二个控制台中使用某些逻辑来查找该信息。

我通常使用的另一种方法是使用WMI:

PS>get-wmiobject win32_process|where {$_.name -eq "powershell.exe"}|select-exp commandline

一个例子:

CommandLine                : powershell.exe -file "./loop.ps1"

这意味着你需要调用powershell.exe来运行你的脚本。

答案 1 :(得分:0)

当我对本地计算机上的进程感兴趣时,我会使用

get-process *powershell*

我也想获得PowerShell ISE,因此也就是通配符。

答案 2 :(得分:0)

我必须这样做,并编写了一个module,它使用互斥锁将脚本调用限制为单个实例。要使用它,请调用Enter-SingleInstance函数,如果这是调用它的第一个脚本实例,则返回true;如果不是第一个实例,则返回false(默认情况下,它将使用该脚本)标识脚本实例的路径,但是您可以使用自定义标识符,例如GUID。最后,您需要调用Exit-SingleInstance来释放互斥锁,例如:

if (!(Enter-SingleInstance)) {
    throw "The script is already running."
}
else {
    try {
        # Do what you need to do.
    }
    finally {
        # Make sure you exit single instance on both success and failure.
        Exit-SingleInstance
    }
}