2017-01-12 3 views
1

私はCMDプロセスではなく、Start-Processから実際のgruntプロセスを取得できますか?

Start-Process grunt -ArgumentList 'serve' -PassThru 

を使用してArrayListに追加しています。私が上記のArrayListを見ると、実際にはnode.jsというプロセスが起動されたので、cmdというプロセスが表示されます。私がStop-Processにしようとすると、明らかに、cmdプロセスを殺し、実行中ではなく、gruntを殺します。 Get-Process nodegruntの実行を見つけることができます。

問題は、同時に複数のgruntsを実行する必要があり、私は何とかそれらを区別する方法が欲しいです。それを初期化すると実際にnodeプロセスをPowerShellに取得する方法はありますか?

答えて

2

これは、gruntgrunt.cmdで起動し、CMDによって実行されるために発生します。このファイルは、nodegruntを起動します。ここで

はnotepad2.exeあなたの例と同様にCMDから打ち上げ見つける方法の例です:

作男のためにこれを翻訳
# start a CMD which starts notepad2 and then waits on it 
$process = Start-Process -PassThru 'cmd.exe' '/c "C:\Program Files\Notepad2\Notepad2.exe"' 

# Wait for notepad2 to be launched 
Start-Sleep -Seconds 2 

# find the children of CMD, and kill the one which is notepad2 
(Get-CimInstance win32_process -Filter "ParentProcessId='$($process.Id)' AND Name = 'Notepad2.exe'") | %{ Stop-Process -Id $_.ProcessId} 

# start Grunt via grunt.cmd 
$process = Start-Process grunt -ArgumentList 'serve' -PassThru 

# Wait for node to be launched 
Start-Sleep -Seconds 2 

# find the children of CMD, and kill the one which is node 
(Get-CimInstance win32_process -Filter "ParentProcessId='$($process.Id)' AND Name = 'node.exe'") | %{ Stop-Process -Id $_.ProcessId} 
+1

'-Filter'と' Where-Object'の両方を使う理由は何ですか? Get-CimInstance -ClassName Win32_Process -Filter ParentProcessId = $($ process.Id)とName = 'notepad.exe'は、両方のファイルを1つの '-Filter'でマージすることができます(WMIはそのプロパティに" Name " " – BartekB

+0

シンタックスを理解する上での怠け者とクエリの少なくとも一部が効率のためにcimフィルタになければなりません – TravisEz13

+0

@BartekBのコメントごとに' -Filter'を更新し、 'Where-Object'を削除しました。 – TravisEz13

1

gruntは、Win32実行可能ではありませんそれはnode.exeによって実行されるjavascriptファイルです。

$ps = start-process -passthru node -argumentlist "$env:APPDATA\npm\node_modules\grunt\bin\grunt" 
+0

問題はプロジェクトフォルダからローカルの 'grunt serve'を起動する必要があることです。フォルダには 'gruntfile.js'しかありません。それを '-ArgumentList'を通して' node'に与えることは、そのトリックを行いません。 – ephemeris

関連する問題