2

我只是偶然发现了 PowerShell 工作流的这种奇怪行为,现在我很好奇是否有其他人可以重现该行为,甚至可以向我解释。

为了描述这种情况,我创建了两个几乎相同的工作流程。唯一的区别是 PSCredential 对象是在第一个工作流范围内创建的,而第二个是在 inlinescript 中创建的。

首先,我使用以下代码定义工作流程:

workflow WorkflowCred
{
    [cmdletbinding()]
    Param()
    $Password    = 'test' | ConvertTo-SecureString -AsPlainText -Force
    $Credential  = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'test',$Password
    InlineScript 
    {
        Function Test-Verbose 
        {
            [CmdletBinding()]
            Param(
                $Credential
            )
            Write-Output 'Start'
            $Credential.GetType().FullName
            Write-Verbose 'Testing'
            Write-Output 'End'
        }
        Test-Verbose -Credential $Using:Credential
    }
}

workflow InlineCred
{
    [cmdletbinding()]
    Param()
    InlineScript 
    {
        Function Test-Verbose 
        {
            [CmdletBinding(
            )]
            Param(
                $Credential
            )
            Write-Output 'Start'
            $Credential.GetType().FullName
            Write-Verbose 'Testing'
            Write-Output 'End'
        }
        $Password = 'test' | ConvertTo-SecureString -AsPlainText -Force
        $Credential  = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'test',$Password
        Test-Verbose -Credential $Credential
    }
}

现在到了奇怪的地方。我可以毫无问题地运行以下三个命令:

WorkflowCred
InlineCred
WorkflowCred -Verbose

但是,如果我使用 -Verbose 运行第二个工作流程,我的控制台会冻结,直到我按下 CTRL+C??

InlineCred -Verbose

如果以下所有条件都为真,我可以看到此行为:

  • 我从 InlineScript 中运行一个函数(在 PowerShell 工作流中)
  • 其中一个参数被赋予一个 PSCredential 类型的对象作为值
  • PSCredential 对象是在内联脚本中创建的
  • 该函数正在写入详细流

我已经在 PowerShell 版本 3 和 4 中尝试过。

4

0 回答 0