2015-01-07 2 views
3

내 nodejs 프로젝트에서 USB 플래시 드라이브가 플러그인/아웃되었을 때를 감지해야합니다. PowerShell 스크립트를 사용하고 child_process exec 또는 spawn을 사용하여 실행했습니다.nodejs에서 장시간 실행되는 powershell 스크립트를 실행

psscript.ps1

Write-Host "listening for Win32_VolumeChangeEvent"; 
Register-WmiEvent -Query "SELECT * FROM Win32_VolumeChangeEvent" -Action {Write-Host "something happened"} | Out-Null; 

내가 PowerShell의 전문가 모르겠지만 그냥 volumeChangeEvent에서 수신하고

Nodejs는 다음 코드

를 사용하여 아이로 급부상 발사 때 something happened를 작성해야

nodescript.js

var spawn = require('child_process').spawn; 
var child = spawn('powershell.exe', ['psscript.ps1']); 
child.stdout.on('data', function(data){ 
    console.log('DATA:', data.toString()); 
}); 
child.stdout.on('close', function(data){ 
    console.log('psscript closed'); 
}); 

어린이의 표준 출력에서 ​​무엇이든 잡아서 파싱해야합니다. 데모 용으로 그냥 앞에 붙인 문자열 DATA:을 인쇄합니다.

이것은 로그입니다. nodescript는 psscript를 생성하고 내가 원하는대로 DATA:으로 출력을 인쇄합니다. 문제는 psscript가 닫히고 nodejs가 종료되어 이벤트를 수신하지 않는다는 것입니다.

C:\myproject>node nodescript.js 
DATA: listening for Win32_VolumeChangeEvent 
DATA: 

psscript closed 

C:\myproject> 

그래서 나는 powershell을 닫지 않게 할 방법을 찾고있었습니다. 이 로그로 연결되는 var child = spawn('powershell.exe', ['-noexit', script]);의 스폰에서 -noexit 인수를 사용하여 종료되었습니다.

C:\myproject>node nodescript.js 
listening for Win32_VolumeChangeEvent 
PS C:\myproject> something happened 
something happened 

nodescript는 listening for Win32_VolumeChangeEvent 잘 인쇄하고 psscript를 생성합니다하지만 그것은합니다 (PS 통지) PS C:\myproject>를 인쇄합니다. PowerShell 스크립트는 이벤트 리스너를 등록한 다음 닫았으므로 (따라서 PS C:\myproject>) powershell은 여전히 ​​노드 (노드 something happened)를 실행하고있었습니다. 그것은 단지 노드가 이벤트 리스너를 다루는 방식에 익숙하기 때문에 혼란 스럽습니다 (리스너가 연결될 때 노드가 닫히지 않습니다). 어쨌든 powershell 스크립트는 계속 듣고 통보합니다. 그것은 플래시 드라이브를 꽂고 껐기 때문에 두 번 인쇄 된 something happened입니다. 거의 내가 원하는하지만 문제는 아이가 -noexit으로 양산한다는 것입니다 무엇

내 nodejs 콘솔을 인수하고 결코 child.stdout로 출력하지 않고 child.stdout.on('data', ...)가 데이터를 수신하지 상태에서 파워 쉘의 출력을 오염. 두 번째 로그에서 볼 수 있듯이 DATA:은 없습니다. 그래서 나는

노드에게을 계속 실행하기 위해 여러분의 도움이

+0

스크립트 끝 부분에 '대기 이벤트'를 추가하면 어떻게됩니까? 이를 사용하거나 이벤트를 기다리는 루프가 필요할 수도 있습니다 : while ($ true) {Wait-Event | 제거 - 이벤트}'. –

답변

0

주셔서 감사합니다 함께 일을 할 수있어 - 가다가 그냥 코드 후 while(true) {} 문을 추가 할 수 있습니다.

결국 시간 제한, 당신은 setTimeout를 사용하여 제한 시간이 만료되면 process.exit()를 호출 할 수 있습니다 노드 인스턴스를 이동하십시오.

관련 문제