2017-07-24 47 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

相关问题