我正在编辑一个我需要转换为exe的脚本。它在运行时有一些Write-Host
输出的脚本状态。这导致脚本的exe向用户显示对话框,迫使他们在脚本完成之前单击“确定”3到4次。
我想保留Write-Host
输出,但只是在最终用户从exe执行时隐藏它们(对话框)。
这可能吗?我查看了代码不喜欢的[void]
。我可以开始工作的唯一方式就是用#
评论它,但我确信有更好的方法。
我想要隐藏/压制的示例:
Write-Host "Current Status = " $status
答案 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