2017-12-27 1 views
0

먼저 프로그램이 실행 중인지 확인하고 싶지 않은 경우 먼저 특정 파일을 삭제하고 PowerShell 스크립트를 만들려고합니다. 지금까지 내가 다음과 같습니다 :PowerShell에서 파일을 삭제하기 전에 프로그램이 실행되고 있는지 확인하는 방법은 무엇입니까?

$Prog = "C:\Program Files (x86)\xyz.exe" 
if ((Get-Process $Prog -EA SilentlyContinue) -eq $null) { 
} 
Remove-Item "C:\Program Files (x86)\abc\123.xml" 
Remove-Item "C:\Program Files (x86)\abc\456.xml" 

그러나이 코드는 프로그램이 실행 중이더라도 파일을 삭제합니다. 따라서 Remove-Item 명령을 사용하기 전에 처음 2 (또는 3) 줄을 무시합니다.

+0

이 코드가 오류를 발생 시키거나 의도 한대로 동작하지 않습니까? –

+0

직접 고치려 한 모든 시도와 함께 그 세부 사항을 질문에 추가하는 것이 좋습니다. –

답변

2

문제는 두 가지입니다. 먼저 Get-Process은 프로세스 경로가 아닌 -Name 매개 변수의 프로세스 이름을 사용합니다. 즉, get-process $Prog -ea SilentlyContinue은 프로세스를 반환하지 않으며 항상 null입니다.

Get-ChildItem을 사용하면 전체 경로에서 프로세스 이름 만 얻을 수 있습니다. 그런 다음 특정 경로에 있어야하는 경우 Path 속성을 사용하여 Where-Object으로 필터링 한 다음 반환 된 개체를 필터링 할 수 있습니다.

두 번째로 Get-Process으로 프로세스를 반환 할 때도 마찬가지입니다. if 문에서 실행을 일시 중지 할 것이 없으므로 계속 진행합니다. while 루프와 Start-Sleep cmdlet을 사용하면 프로세스가 실행될 때까지 루프 할 수 있습니다.

$Prog = "C:\Program Files (x86)\xyz.exe" 
$ProcessName = (Get-ChildItem $Prog).basename 
while (!(Get-Process $ProcessName | Where-Object {$_.Path -eq $Prog})) { 
    Start-Sleep 1 
} 
Remove-Item "C:\Program Files (x86)\abc\123.xml" 
Remove-Item "C:\Program Files (x86)\abc\456.xml" 
관련 문제