隐藏写主机输出

时间:2017-08-30 05:49:41

标签: powershell

我正在编辑一个我需要转换为exe的脚本。它在运行时有一些Write-Host输出的脚本状态。这导致脚本的exe向用户显示对话框,迫使他们在脚本完成之前单击“确定”3到4次。

我想保留Write-Host输出,但只是在最终用户从exe执行时隐藏它们(对话框)。

这可能吗?我查看了代码不喜欢的[void]。我可以开始工作的唯一方式就是用#评论它,但我确信有更好的方法。

我想要隐藏/压制的示例:

Write-Host "Current Status = " $status

2 个答案:

答案 0 :(得分:5)

根据评论,您应该使用Write-Verbose代替Write-Host,因为这样可以轻松地为您提供所需的功能。但是,要使用Write-Verbose,还需要进行其他一些更改:

首先,您需要将其添加到脚本的顶部:

 [cmdletbinding()]
 Param()

这为您的脚本提供了一组默认参数,其中一个参数包含-Verbose,可以在使用时显示任何Write-Verbose条消息。

其次(基于您给出的示例),您可能需要稍微重写一些(现在)Write-Verbose字符串语句。例如:

write-host "Current Status = " $status

Write-Host一起使用,因为它需要一个字符串数组作为输入。 Write-Verbose的情况也是如此,它只需要一个字符串,因此上面的示例需要更改为:

Write-Verbose "Current Status =  $status"

请注意,通过使用双引号字符串,变量仍将被展开。

答案 1 :(得分:0)

你可以试试这个:

function Remove-WriteHost
{
   [CmdletBinding(DefaultParameterSetName = 'FromPipeline')]
   param(
     [Parameter(ValueFromPipeline = $true, ParameterSetName = 'FromPipeline')]
     [object] $InputObject,

     [Parameter(Mandatory = $true, ParameterSetName = 'FromScriptblock', Position = 0)]
     [ScriptBlock] $ScriptBlock
   )

   begin
   {
     function Cleanup
     {
       # clear out our proxy version of write-host
       remove-item function:\write-host -ea 0
     }

     function ReplaceWriteHost([string] $Scope)
     {
         Invoke-Expression "function ${scope}:Write-Host { }"
     }

     Cleanup

     # if we are running at the end of a pipeline, need to immediately inject our version
     #    into global scope, so that everybody else in the pipeline uses it.
     #    This works great, but dangerous if we don't clean up properly.
     if($pscmdlet.ParameterSetName -eq 'FromPipeline')
     {
        ReplaceWriteHost -Scope 'global'
     }
   }
}
Remove-WriteHost

现在尝试:

  Write-Host "Something"

输出无效。

参考:THIS