2017-07-24 49 views
4

我正在學習PowerShell,並且正在使用寫主機來檢查新PowerShell腳本文件中的變量賦值。然後我讀這篇文章: http://windowsitpro.com/blog/what-do-not-do-powershell-part-1使用PowerShell,我怎樣才能讓Write-Debug輸出出現在控制檯中?

所以,在我的.ps1文件我換成這樣的語句:

Write-Host "Start" 
Write-Host "End" 

...這一點:

Write-Debug "Start" 
Write-Debug "End" 

但是,當我跑了保存的Windows PowerShell ISE腳本沒有輸出寫入控制檯。我在調用腳本的語句中添加了-debug,如下所示:

PS E:\trialrun> .\MyScript.ps1 -debug 

但是,輸出不會寫入控制檯。顯然,我正在使用寫入調試不正確。我怎樣才能讓調試輸出寫入控制檯?謝謝。

+0

在腳本中更改'Write-Debug「開始」'編寫 - 調試「開始」-debug「(而不是在您調用腳本時試圖綁定它),然後對最後一個執行相同的操作。或者檢查[綁定參數的這個答案](https://stackoverflow.com/questions/10159066/print-debug-messages-to-console-from-a-powershell-function-that-returns/10159250#10159250)如調試。 – JGreenwell

回答

6

TL;博士

  • 運行$DebugPreference = 'Continue'開始從Write-Debug電話看到輸出。

  • 當你完成後,恢復選項變量$DebugPreference爲它的默認值,使用$DebugPreference = 'SilentlyContinue'


無論是從Write-Debug報表打印是通過兩種機制來控制輸出:

$DebugPreference默認爲SilentlyContinue,這可以解釋爲什麼你沒有看到在默認情況下Write-Debug陳述的任何輸出。

當您使用通用參數-Debug,你基本上設置$DebugPreference的調用命令只,你不約而同它的值設置爲Inquire,這不僅打印Write-Debug消息,但也在暫停在每一個這樣的聲明,問你要如何繼續

  • 對於自定義腳本或功能支持-Debug常見的參數,它必須與[CmdletBinding()]屬性爲其param()塊聲明,爲Mathias' answer所示。

由於此提示-AT-任何─Write-Debug -call行爲可以破壞性$DebugPreference = 'Continue'可能是更好的辦法。

8

你需要在你的腳本CmdletBinding屬性,如果你想爲常見的參數(包括-Debug)支持:

[CmdletBinding()] 
param() 

Write-Debug Start 
Write-Debug End 

我建議有一個看about_Functions_CmdletBindingAttribute幫助文件

+0

這是一般的好建議,但與其他常用參數(例如'-ErrorAction')不同,'-Debug'不允許爲隱含的命令作用域的$ DebugPreference變量傳遞_specific value_,而是總是設置它就是'Inquire',這意味着如果你唯一的意圖是打印調試消息,那麼遇到的每個'Write-Debug'語句都會_prompt_,這是破壞性的。 – mklement0

-1

我使用write-output而不是write-host,並將其打印到控制檯。 write-verbose是另一種選擇。

請參見本文的詳細信息http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/

編輯:我被告知,我的做法是不好的。有關原因,請參閱下面的評論。

+1

'Write-Output'寫入_success_輸出流,這是輸出變爲default_的地方(只有在需要使用'-NoEnumerate'輸出集合作爲單個對象時才需要顯式使用'Write-Output' )。你絕對不應該發送_debug_消息到成功流;後者用於_results_(數據)。 – mklement0

+0

@ mklement0我想這是真的,如果你正在編寫一個cmdlet。寫輸出和寫詳細的工作對我來說,因爲我沒有把我的腳本放入管道。他們只是作爲獨立的腳本執行。 – DeanOC

+0

'Write-Output'(流'1'),'Write-Debug'(流'5')和'Write-Verbose'(流'5')具有不同目的的所有目標不同流。這不僅僅是關於編寫cmdlet,它甚至適用於如果你所做的只是_save_輸出(技術上它仍然是長度爲_1_的_pipeline_):如果你調用通過成功輸出結果和調試消息的自定義腳本流,你捕獲的東西顯然會被「污染」。我不是那個倒票的人,但如果你讓這個答案保持原樣,我也會(雖然它可能並不明顯,但我會讓你知道這是禮貌)。 – mklement0

相關問題