我只是偶然发现了 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 中尝试过。