【问题标题】:How to Write-Verbose from Invoke-Command?如何从 Invoke-Command 编写详细信息?
【发布时间】:2013-04-18 07:13:35
【问题描述】:

在PowerShell中

Write-Verbose-Verbose 标志用于在以详细模式运行命令时提供详细信息。我正在远程运行一些脚本,并希望捕获详细的输出输出。但是,Invoke-Command 似乎没有捕获详细通道。

PS:> Invoke-Command -ComputerName MY-COMPUTERNAME -Verbose { Write-Verbose "blah" }
PS:>

如何在运行远程脚本时捕获详细输出?

【问题讨论】:

标签: powershell powershell-remoting


【解决方案1】:

我认为您可以做的最好的事情是创建一个具有 [CmdletBinding()] 的函数,因此它支持 -verbose 开关。然后,您将能够使用本地 $VerbosePreference 捕获本地函数的详细状态,并将其传递给调用命令。这仅适用于 Powershell 3.0 及更高版本,因为您需要使用 $Using 范围修饰符。

Function write-blah{
[CmdletBinding()]
Param()
Invoke-Command -ComputerName MY-COMPUTERNAME  {$VerbosePreference=$Using:VerbosePreference; Write-Verbose "blah" }
}

然后你会这样调用你的函数。

Write-Blah -verbose

在测试中这对我有用。我相信你的函数必须支持参数,因此是空的 Param() 块。

【讨论】:

  • 首选答案,因为它更通用。
  • 很好,尽管在我的情况下它使输出过于冗长,因为我从一些将模块加载到远程上下文中的 cmdlet 收到了数百条导入/导出消息。作为解决方法,我使用parameter default values-Verbose 仅传递给Write-Verbose 调用而不是所有cmdlet:$PSDefaultParameterValues = @{ "Write-Verbose:Verbose" = $using:VerbosePreference }
【解决方案2】:

试试这个方法:

Invoke-Command -ComputerName MY-COMPUTERNAME  {$VerbosePreference='Continue'; Write-Verbose "blah" }

【讨论】:

  • 我明白了,并不是因为-Verbose 标志没有将 VerbosePreference 传递到远程上下文中,详细通道没有被捕获那么多(它到底做了什么? )。知道如何在不修改脚本本身的情况下设置远程 VerbosePreference 吗?
  • 我不知道有一种方法可以在调用命令中做到这一点。您可以创建一个自定义会话,将该首选项作为默认设置,然后将您的调用命令定位到该会话。但该首选项变量的默认值是“SilentlyContinue”,您使用调用命令的唯一选项是在脚本块中重置它。
  • 如果您的本地 $VerbosePreference 设置为显示,则 -Verbose 开关在您的示例中所做的是启用调用命令 cmdlet 的详细输出。不幸的是,它似乎没有产生任何详细的输出,所以基本上它什么也没做......
【解决方案3】:
Invoke-Command -ComputerName MY-COMPUTERNAME { Write-Verbose "blah" -Verbose }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多