当所有参数都相同时限制 PS 脚本的一个实例
Restricting one instance of PS Script when all parms are same
我运行使用以下参数编写脚本:
test.ps1 -parm1 abc1 -parm2 abc2 -parm3 abc3
我正在从我的另一个应用程序远程执行脚本,并且希望 运行 在参数相同的情况下只有一个脚本实例。
换句话说,如果所有参数都相同,那么任何时候只有一个脚本实例应该 运行ning。
我正在使用以下逻辑,但它返回 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%'"
…它没有返回任何内容,这意味着它不是 运行ning 或 运行 并且关闭了。
我刚刚尝试了您发布的内容,上面的内容按预期拉动了流程线。
# 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
...
但是,您陈述的用例有点奇怪。因为,既然你首先启动了代码,并且你说,你只想要它 运行 一次,那么为什么还要再次启动它,只是为了检查你已经知道的是 运行宁?
如果你说的是,你需要按顺序 运行 多次,然后按顺序执行。
如果您是说,任何用户都可以在任何机器上使用您的应用程序,那么您仍然只能在不同机器上一次使用一个 运行ning,因此检查确实没有实际意义。除非您的代码在同一个 files/database 上工作(创建-更新-删除操作),并且在其他用户尝试使用您的代码对其进行操作时尝试避免错误。
我假设您想防止脚本的多个实例 运行 在 1 个给定主机上同时运行。
在那种情况下,让您的脚本创建一个所谓的 'lock file'(只是在您选择的指定位置的一些文本文件)
在脚本的开头,检查文件是否存在(如果存在,另一个实例是 运行ning;退出!)
如果它不存在;创建锁定文件,执行脚本业务,最后不要忘记删除锁定文件(除非不允许脚本在该计算机上 运行 多次)
随意向锁定文件中添加其他信息(例如正在使用的参数、进程 ID),以更加灵活地使用该文件。
我运行使用以下参数编写脚本:
test.ps1 -parm1 abc1 -parm2 abc2 -parm3 abc3
我正在从我的另一个应用程序远程执行脚本,并且希望 运行 在参数相同的情况下只有一个脚本实例。
换句话说,如果所有参数都相同,那么任何时候只有一个脚本实例应该 运行ning。
我正在使用以下逻辑,但它返回 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%'"
…它没有返回任何内容,这意味着它不是 运行ning 或 运行 并且关闭了。
我刚刚尝试了您发布的内容,上面的内容按预期拉动了流程线。
# 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
...
但是,您陈述的用例有点奇怪。因为,既然你首先启动了代码,并且你说,你只想要它 运行 一次,那么为什么还要再次启动它,只是为了检查你已经知道的是 运行宁?
如果你说的是,你需要按顺序 运行 多次,然后按顺序执行。
如果您是说,任何用户都可以在任何机器上使用您的应用程序,那么您仍然只能在不同机器上一次使用一个 运行ning,因此检查确实没有实际意义。除非您的代码在同一个 files/database 上工作(创建-更新-删除操作),并且在其他用户尝试使用您的代码对其进行操作时尝试避免错误。
我假设您想防止脚本的多个实例 运行 在 1 个给定主机上同时运行。
在那种情况下,让您的脚本创建一个所谓的 'lock file'(只是在您选择的指定位置的一些文本文件)
在脚本的开头,检查文件是否存在(如果存在,另一个实例是 运行ning;退出!) 如果它不存在;创建锁定文件,执行脚本业务,最后不要忘记删除锁定文件(除非不允许脚本在该计算机上 运行 多次)
随意向锁定文件中添加其他信息(例如正在使用的参数、进程 ID),以更加灵活地使用该文件。