programing

Powershell - 프로세스가 실행되고 있지 않으면 프로세스를 시작합니다.

telebox 2023. 8. 25. 23:29
반응형

Powershell - 프로세스가 실행되고 있지 않으면 프로세스를 시작합니다.

아무도 도와주지 마세요.프로세스가 실행 중인지 확인하고 실행되지 않으면 시작할 스크립트를 작성하려고 합니다.프로세스가 실행 중이면 아무것도 수행되지 않습니다.지금까지 다음과 같이 제안했지만 이미 실행 중인지 여부에 관계없이 프로세스의 새로운 인스턴스를 시작하고 있습니다.어떤 도움이든 감사합니다.

$Prog = "C:\utilities\prog.exe"
$Running = Get-Process prog -ErrorAction SilentlyContinue
$Start = ([wmiclass]"win32_process").Create($Prog)
if($Running -eq $null)
{$Start}
else
{}

우선, 당신의 코드에 잘못된 점이 있습니다.코드에서 프로그램이 이미 실행 중인지 여부를 평가하기 전에 프로세스가 생성됩니다.

$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}

코드를 {}(스크립트 블록)로 묶어서 코드에서 추가로 평가해야 하는 코드 블록을 만들 수 있습니다.

$Prog = "C:\utilities\prog.exe"
$Running = Get-Process prog -ErrorAction SilentlyContinue
$Start = {([wmiclass]"win32_process").Create($Prog)} 
if($Running -eq $null) # evaluating if the program is running
{& $Start} # the process is created on this line

그러나 문제를 해결하기 위해 짧은 원라이너를 찾고 있는 경우:

if (! (ps | ? {$_.path -eq $prog})) {& $prog}

Get-Process cmdlet에서 프로세스 이름 인수는 파일 확장명이 없는 실행 파일의 이름이어야 합니다.대체 시도$Prog = "C:\utilities\prog.exe"와 함께$Prog = "prog".

대신 Where-Object cmdlet을 사용하여 프로세스를 필터링하면 스크립트를 더 쉽게 읽을 수 있을 것입니다.다음은 예입니다.

$programName = "prog"
$isRunning = (Get-Process | Where-Object { $_.Name -eq $programName }).Count -gt 0

if ($isRunning)
 # ...
else
 # ...

그렇게 하면 당신은 그것을 없앨 수 있습니다.-ErrorAction SilentlyContinue Get-Process가 지정된 이름의 프로세스를 찾을 수 없는 경우 오류를 범한다는 사실을 모르는 사용자에게 혼동을 줄 수 있는 인수입니다.

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-ProcessWMI 대신 cmdlet을 사용하여 새 프로세스를 생성합니다.다음을 사용할 수도 있습니다.

if (!$Running) { C:\utilities\prog.exe }

콘솔 응용 프로그램이 아닌 경우(따라서 PowerShell 스크립트가 종료될 때까지 차단됨).PowerShell은 여전히 셸이기 때문에 프로그램을 시작하는 것은 기본적으로 매우 잘 작동하는 것입니다 :-)

당신은 심지어 줄을 설 수도 있습니다.$running가변적이지만, 그렇다면 당신이 하는 일을 명확히 하기 위해 댓글을 달아야 할 것 같습니다.

$path = "C:\utilities\prog.exe"        
$list = get-process | where-object {$_.Path -eq $path }     
if ($list -eq $null) { start-process -filepath $path }

또는

$path = "C:\utilities\prog.exe"
get-process | where-object {$_.Path -eq $path } | measure-object | where-object { $_.Count -eq 0} | foreach-object {start-process -filepath $path }

if 문과 변수 선언 하나를 저장합니다.한 줄 명령도 사용할 수 있습니다.

  1. 프로세스 가져오기
  2. 관심 있는 경로를 선택합니다.
  3. measure 개체를 사용하여 보유한 목록에 대한 통계를 가져옵니다.
  4. 통계의 카운트 값이 0인 경우에만 파이프를 계속합니다.
  5. 프로세스 시작

끝에 있는 앞잡이들이 당신을 방해하지 않도록 하라.측정 개체는 하나의 항목만 반환하고, 에서 하나 또는 0을 반환합니다.foreach는 결과가 0인 경우에만 실행하는 데 사용됩니다.두 개 이상의 프로세스가 시작되지 않습니다.:)

언급URL : https://stackoverflow.com/questions/8834278/powershell-if-a-process-is-not-running-start-it

반응형