在我的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寫something happened
火災時
使用的NodeJS下面的代碼
派生它的孩子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 C:\myproject>
(注意PS
)。我猜powershell腳本註冊了事件監聽器,然後關閉(因此PS C:\myproject>
),但powershell仍在運行(因此something happened
)以及節點。這讓我感到困惑,因爲我習慣了節點處理事件監聽器的方式(當連接任何監聽器時節點不會關閉)。無論如何,PowerShell腳本不斷收聽和通知。這是兩次打印something happened
,因爲我插入和拔出閃存驅動器。
這幾乎是我想要的,但問題是,孩子產生了與-noexit
接管我的控制檯的NodeJS與PowerShell的輸出污染它,而它永遠不會輸出到child.stdout
和child.stdout.on('data', ...)
從未接收到任何數據。正如你可以在第二個日誌中看到的那樣,沒有DATA:
。 所以我不能與它
謝謝您的幫助
如果您在腳本的末尾添加了「Wait-Event」會發生什麼?你也許可以使用它,或者它可能需要一個等待事件的循環:while($ true){Wait-Event |刪除事件}'。 –