Hide Write-Host outputs

爷,独闯天下 提交于 2021-02-08 04:00:31

问题


I am editing a script which I need to convert to exe. It has a few Write-Host outputs of the status of the script when running. This causing the exe of the script to show up dialog boxes to the user forcing them to click OK 3 or 4 times before the script finishes.

I'd like to keep the Write-Host output but just hide them (the dialog boxes) when the end user executes it from the exe.

Is this possible? I have looked into [void] which the code doesn't like. The only other way I can get to work is just commenting it out with #, but I'm sure there's a better way.

Example of what I want hidden/suppressed:

Write-Host "Current Status = " $status

回答1:


Per the comments you should use Write-Verbose instead of Write-Host as this will give you the functionality you want with very little effort. However to use Write-Verbose there's a couple of other changes you'll need to make:

First you'll need to add this to the top of your script:

 [cmdletbinding()]
 Param()

This gives your script a set of default parameters one of which includes -Verbose which enables any Write-Verbose messages to be displayed when used.

Secondly (based on the example you gave) you might need to slightly rewrite some of your (now) Write-Verbose string statements. For example:

write-host "Current Status = " $status

Works with Write-Host because it takes an array of strings as input. The same is not true of Write-Verbose, it only takes a single string, so the above example would need to be changed to:

Write-Verbose "Current Status =  $status"

Note that by using double quote strings the variable will still be expanded.




回答2:


You can try this:

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

Now try:

  Write-Host "Something"

Output will be nothing.

Refer: THIS



来源:https://stackoverflow.com/questions/45952811/hide-write-host-outputs

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!