当所有参数相同时限制一个PS脚本实例

时间:2018-08-29 22:20:39

标签: windows powershell powershell-v4.0 powershell-remoting

我正在使用以下参数运行脚本:

test.ps1 -parm1 abc1 -parm2 abc2  -parm3 abc3

我正在从另一个应用程序远程执行脚本,并且想在参数相同时仅运行脚本的一个实例。

换句话说,如果所有参数都相同,那么任何时候都只应运行脚本的一个实例。

我正在使用以下逻辑,但它返回null

Get-WmiObject Win32_Process -Filter "Name='powershell.exe' AND CommandLine LIKE '%test.ps1%'"

2 个答案:

答案 0 :(得分:1)

如果您运行了此...

WmiObject Win32_Process -Filter "Name='powershell.exe' AND CommandLine LIKE '%test.ps1%'"

...,它什么也没返回,这意味着它没有在运行或运行并关闭。

我刚刚尝试了您发布的内容,以上内容按预期完成了工作。

# begin test.ps1 script

Param
(
$parm1,
$parm2, 
$parm3  
)

'hello'


# end test.ps1 script

# SCC is a alias for a function I have to shell out to the console host as needed
# aka Start-ConsoleCommand
# it has code to prevent the console host from closing so I can work in it if needed.

scc -ConsoleCommand '.\test.ps1 -parm1 abc1 -parm2 abc2  -parm3 abc3

# console window results
hello

检查过程信息

Get-WmiObject Win32_Process -Filter "Name='powershell.exe' AND CommandLine LIKE '%test.ps1%'"

# Results
...
Caption                    : powershell.exe
CommandLine                : "C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" -NoExit -Command  &{ .\test.ps1 -parm1 abc1 -parm2 abc2  -parm3 abc3
...  

但是,您陈述的用例有点奇怪。既然,既然您是从头开始编写代码的,则是说,您只希望它运行一次,那么为什么还要再次启动它,只是检查您已经知道的代码正在运行?

如果您要说的话,您需要连续多次运行它,然后依次执行。

如果您说任何用户都可以从任何计算机上使用您的应用程序,那么您一次只能在不同计算机上运行一个应用程序,因此检查确实没有意义。除非您的代码正在同一文件/数据库上工作(创建-更新-删除操作),并且在其他用户尝试使用您的代码对其执行操作时尝试避免错误。

答案 1 :(得分:0)

我假设您想防止脚本的多个实例在1个给定的主机上同时运行。

在这种情况下,让您的脚本创建一个所谓的“锁定文件”(只是您选择的指定位置的一些文本文件)

在脚本的开头,检查文件是否存在(如果存在,则说明另一个实例正在运行;请保释!) 如果不存在;创建锁定文件,完成脚本业务,最后不要忘记删除锁定文件(除非脚本不允许在该计算机上运行多次)

可以随时将其他信息添加到锁定文件中(例如,正在使用的参数,进程ID),以更加灵活地使用该文件。