我正在使用这样的批处理文件运行Powershell脚本:
@ECHO OFF
PowerShell.exe -Command "& 'U:\...\...\..._PS.ps1'"
PAUSE
此.ps1脚本可能需要15分钟才能运行。在这段时间内,我想避免再次运行此脚本。如果用户运行.bat文件,我希望控制台打印出类似“ Powershell脚本已在运行,请等到结束”之类的内容。
从各种示例中,我已经看到了这段代码:
echo off
tasklist /fi "imagename eq powershell.exe" |find ":" > nul
if errorlevel 1 taskkill /f /im "powershell.exe"
exit
有两个问题:1.它仅适用于.exe文件,例如记事本,powershell等...我具有.ps1的路径2.它杀死了任务,我只需要显示一条消息
如果坚持使用-Command
参数,您可以执行以下操作:
powershell.exe -Command "if (((Get-CimInstance Win32_Process -Filter \"name = 'powershell.exe'\").CommandLine -match '..._PS\.ps1').Count -gt 1) {'Powershell is already running.'} else {& 'U:\...\...\..._PS.ps1'}"
想法是检查当前正在运行的Win32_Process
项目,这些项目的命令行包含..._PS.ps1
文件。由于检查命令将在检查条件之前将自身添加到堆栈中,因此您必须检查1次以上的事件。使用.
运算符时,任何文字-match
字符都需要反斜杠转义,因为-match
使用正则表达式。请注意内部双引号的反斜杠转义,因为您是从CMD Shell运行的。从PowerShell运行此命令将需要不同的转义符。