Powershell-如果进程未运行,请启动它
请帮忙。我正在尝试编写一个脚本来检查进程是否正在运行,如果没有,则启动它。如果进程正在运行,则不应执行任何操作。到目前为止,我已经提出了以下内容,但它正在启动该流程的一个新实例,而不管它是否已经在运行。感谢您的帮助Powershell-如果进程未运行,请启动它,powershell,Powershell,请帮忙。我正在尝试编写一个脚本来检查进程是否正在运行,如果没有,则启动它。如果进程正在运行,则不应执行任何操作。到目前为止,我已经提出了以下内容,但它正在启动该流程的一个新实例,而不管它是否已经在运行。感谢您的帮助 $Prog = "C:\utilities\prog.exe" $Running = Get-Process prog -ErrorAction SilentlyContinue $Start = ([wmiclass]"win32_process").Create($Prog) i
$Prog = "C:\utilities\prog.exe"
$Running = Get-Process prog -ErrorAction SilentlyContinue
$Start = ([wmiclass]"win32_process").Create($Prog)
if($Running -eq $null)
{$Start}
else
{}
或
这将为您保存if语句和一个变量声明。它也可以是单行命令:
不要让最后的失败拖累你。度量对象将只返回一个项,其中将返回一或零。foreach仅用于在结果为零时执行。它不会启动多个进程。:) 首先,下面是代码中的错误。 在代码中,在评估程序是否已在运行之前,将创建该进程
$Prog = "C:\utilities\prog.exe"
$Running = Get-Process prog -ErrorAction SilentlyContinue
$Start = ([wmiclass]"win32_process").Create($Prog) # the process is created on this line
if($Running -eq $null) # evaluating if the program is running
{$Start}
通过将代码块包装在{}(脚本块)中,可以创建一个应在代码中进一步计算的代码块:
但是,如果您正在寻找一个简短的单行程序来解决您的问题:
if (! (ps | ? {$_.path -eq $prog})) {& $prog}
在中,进程名参数必须是不带文件扩展名的可执行文件的名称。尝试用$Prog=“Prog”
替换$Prog=“C:\utilities\Prog.exe”
在我看来,如果你过滤掉这个过程,你的脚本会更可读。下面是一个例子:
$programName = "prog"
$isRunning = (Get-Process | Where-Object { $_.Name -eq $programName }).Count -gt 0
if ($isRunning)
# ...
else
# ...
这样,您就可以摆脱
-ErrorAction SilentlyContinue
参数,如果找不到具有指定名称的进程,它可能会引发错误。请记住,PowerShell处理的是对象,而不仅仅是文本。在普通批处理文件中,您可以将变量设置为字符串,然后将其用作命令:
set Foo=dir /b
%Foo%
。。。这在PowerShell中不起作用。因此,您对$Start
的分配已经创建了新的进程,因为=
之后的命令已运行,并且其结果已分配给$Start
而且你把事情复杂化了。我的建议是:
$Running = Get-Process prog -ErrorAction SilentlyContinue
if (!$Running) { Start-Process C:\utilities\prog.exe }
由于Get Process
返回一个对象(其计算结果为$true
)或$null
(其计算结果为$false
),您可以简化如上所示的检查。这称为类型强制,因为if
语句需要一个布尔值,并且在上述情况下,关于将被视为$true
和$false
的规则非常一致。而且它读起来更好
我还使用Start Process
cmdlet而不是WMI来创建新流程。您甚至可以使用以下选项:
if (!$Running) { C:\utilities\prog.exe }
如果应用程序不是控制台应用程序(因此会阻止PowerShell脚本,直到它退出)。PowerShell仍然是一个shell,因此启动程序在本机上运行得非常好:-)
您甚至可以内联
$running
变量,但我想一条注释是为了澄清您的操作。您提到了正确/错误规则。。。可以找到一个很好的帮助杰夫瑞理解它们的小文章。我认为最胡惑的部分是一个元素数组的规则,但是如果你考虑诸如$Start=…
仍将每次启动进程。我测试运行了代码,并启动了多个相同的进程。(请确保使用一个允许自身多个实例的程序进行测试)Hi@LosManos,您是否可能忘记了{}(脚本块)?@jonZ是的,这就是原因。
set Foo=dir /b
%Foo%
$Running = Get-Process prog -ErrorAction SilentlyContinue
if (!$Running) { Start-Process C:\utilities\prog.exe }
if (!$Running) { C:\utilities\prog.exe }