2015-01-07 156 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寫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.stdoutchild.stdout.on('data', ...)從未接收到任何數據。正如你可以在第二個日誌中看到的那樣,沒有DATA:。 所以我不能與它

謝謝您的幫助

+0

如果您在腳本的末尾添加了「Wait-Event」會發生什麼?你也許可以使用它,或者它可能需要一個等待事件的循環:while($ true){Wait-Event |刪除事件}'。 –

回答

0

爲了保持節點運行工作 - uou可以將您的代碼段後只需添加一個while(true) {}聲明。

要讓您的節點實例最終超時,您可以使用setTimeout並在超時過期時致電process.exit()

相關問題