我偶然发现了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
如果满足以下所有条件,我可以看到此行为:
我在PowerShell第3版和第4版中试过这个。