2015-07-10 78 views
0

我試圖使用.net NamedPipeServerStream在PowerShell中使用回調異步使用命名管道。PowerShell中使用回調的異步命名管道

我目前使用下面的代碼:

服務器端:

$myCallback = [AsyncCallback]{ 
    "Connected" 
} 

$pipe = New-Object System.IO.Pipes.NamedPipeServerStream("alert", [System.IO.Pipes.PipeDirection]::InOut, 1, [System.IO.Pipes.PipeTransmissionMode]::Message, [System.IO.Pipes.PipeOptions]::Asynchronous) 
$pipe.BeginWaitForConnection($myCallback, "alertCallback") 

客戶端:

$pipe = new-object System.IO.Pipes.NamedPipeClientStream("alert"); 
$pipe.Connect(3000); 

$sw = new-object System.IO.StreamWriter($pipe); 
$sw.WriteLine("Test"); 

我首先調用服務器端代碼,它報告回調已成功註冊

AsyncState          IsCompleted AsyncWaitHandle      CompletedSynchronously 
----------          ----------- ---------------      ---------------------- 
alertCallback           False System.Threading.ManualRese...       False 

只要客戶端代碼被調用powershell服務器腳本崩潰 - 不會拋出異常,只是我得到一個「Powershell已停止工作」窗口樣式錯誤框。我不知道爲什麼發生這種情況,我似乎無法從腳本中獲取任何異常或其他調試信息,以瞭解發生了什麼問題。如果我試圖做同樣的事情,一切都按預期工作。任何幫助深表感謝。

+0

Windows中的任何日誌客戶端上的日誌? – ojf

+0

不幸的不是。我一直在尋找事件日誌的Powershell部分,我可以看到我知道的異常條目,並且已經從以前編寫上述代碼的失敗嘗試中報告給控制檯,所以我認爲這是正確的地方。 – Nitr0UK

+0

您可以使用sysinternals中的procdump讓它在發生異常時創建轉儲文件。像'procdump -ma -e 100 ''。在發生崩潰轉儲後,您可以開始使用WinDbg進行調查。 –

回答

0
  1. Hope客戶端代碼在作業中或在不同的腳本中。
  2. pipeDirection添加到客戶端管道。
  3. 在寫入客戶端流之前添加sw.AutoFlush = $true
  4. 如果還是不行,請嘗試添加CRLF到消息:$sw.WriteLine("Test\r\n");

希望這有助於。