Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell-如果进程未运行,请启动它_Powershell - Fatal编程技术网

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语句和一个变量声明。它也可以是单行命令:

  • 获取进程
  • 选择你感兴趣的路径
  • 使用“测量对象”获取有关列表的统计信息
  • 仅当统计的计数值为0时,才继续管道
  • 启动过程

  • 不要让最后的失败拖累你。度量对象将只返回一个项,其中将返回一或零。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
    变量,但我想一条注释是为了澄清您的操作。

    您提到了正确/错误规则。。。可以找到一个很好的帮助杰夫瑞理解它们的小文章。我认为最胡惑的部分是一个元素数组的规则,但是如果你考虑诸如(…)< /Cord>之类的事情,它们就有意义了,因此表现出天真的预期:-不需要使用度量/计数。值0被视为$false,非零的值被视为$true。看看jon-z关于实际实现的答案的结尾,你是对的。谢谢你的提示;我学到了一些新东西。jon-z的最后一个例子似乎是最好的。+1因为我的错误导致我在这里包括了扩展。我不知道你的解决方案如何解决这个问题。行
    $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 }