我只是偶然发现了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对象是在inlinescript中创建的

  • 该函数正在写入详细流

我在PowerShell版本3和4中尝试过这个 .