我正在使用以下参数运行脚本:
test.ps1 -parm1 abc1 -parm2 abc2 -parm3 abc3
我正在从我的另一个应用程序远程执行脚本,并且当parms相同时想要只运行脚本的一个实例。
换句话说,如果所有参数都相同,那么任何时候都只应运行一个脚本实例。
我使用以下逻辑但它返回null
Get-WmiObject Win32_Process -Filter "Name='powershell.exe' AND CommandLine LIKE '%test.ps1%'"
如果你跑这个......
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个给定主机上运行。
在这种情况下,让您的脚本创建一个所谓的“锁定文件”(只是您选择的指定位置的一些文本文件)
在脚本的开头,检查文件是否存在(如果存在,另一个实例正在运行;纾困!)如果它不存在;创建锁文件,执行脚本业务,最后不要忘记删除锁文件(除非脚本不允许在该计算机上运行多次)
您可以随意在锁文件中添加其他信息(例如,使用的参数,进程ID),以便更加灵活地使用该文件。