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