2017-12-27 14 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" 

しかし、このコードは、プログラムが実行中であってもファイルを削除します。したがって、最初の2行(または3行)を無視してからRemove-Itemコマンドを実行します。

+0

このコードではエラーが発生するか、意図したとおりに動作しませんか? –

+0

あなたはそれを自分で修復しようと試みたのと一緒に、質問にその詳細を追加することをお勧めします。 –

答えて

2

問題は2つあります。まず、Get-Processは、プロセスパスではなく-Nameパラメータのプロセス名をとります。つまり、get-process $Prog -ea SilentlyContinueはプロセスを返すことはなく、常にnullになります。

Get-ChildItemを使用すると、フルパスからプロセス名だけを取得できます。その後、特定のパスからのものである必要がある場合は、Pathプロパティを使用して、返されたオブジェクトのWhere-Objectでフィルタリングできます。

第2に、Get-Processでプロセスを返す場合でも、 ifステートメントで実行を一時停止するものは何もないので、そのまま続行します。 whileループとStart-Sleepコマンドレットを使用すると、プロセスが実行されるまでループすることができます。

$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" 
関連する問題