$Job = Start-Job -ScriptBlock { $input.GetType().FullName; } -InputObject @(1,2,3);
Wait-Job -Job $Job;
Receive-Job -Keep $Job;
这段代码的结果是:
System.Management.Automation.Runspaces.PipelineReader`1+<GetReadEnumerator>d__0[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
查看PipelineReader .NET 类的文档,它有一个 ReadToEnd()
方法。因此,以下代码应该可以工作:
$Job = Start-Job -ScriptBlock { $input.ReadToEnd(); } -InputObject @(1,2,3);
Wait-Job -Job $Job;
Receive-Job -Keep $Job;
但是,我收到了一个错误消息:
方法调用失败,因为[System.Int32]不包含名为“ReadToEnd”的方法。 + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound + PSComputerName : localhost
于是我想,我将使用PSBase
属性来获取“真实”的对象。
$Job = Start-Job -ScriptBlock { $input.psbase.ReadToEnd(); } -InputObject @(1,2,3);
Wait-Job -Job $Job;
Receive-Job -Keep $Job;
但是我收到了类似的错误消息:
我注意到已有一个Microsoft Connect bug关于这个混乱的问题,但更加让我感到困惑。显然,PipelineReader类有一个令人困惑的命名属性方法调用失败,因为[System.Management.Automation.PSInternalMemberSet]不包含名为'ReadToEnd'的方法。 + CategoryInfo : InvalidOperation: (ReadToEnd:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound + PSComputerName : localhost
<>4__this
,它有一个Read()
方法,但你无法通过使用Get-Member
看到它。
底线:有没有人知道如何简单地“解开”$input
自动变量的内容,当输入通过-InputObject
参数提交给Start-Job
cmdlet时,以便我可以逐个处理对象?此脚本应该只返回
1
,而不是1,2,3
。$Job = Start-Job -ScriptBlock { $input[0]; } -InputObject @(1,2,3);
Wait-Job -Job $Job;
Receive-Job -Keep $Job;
$Job = Start-Job -ScriptBlock { $($input)[0]; } -InputObject @(1,2,3)
对您有用吗? - jscott$input
是什么吗?这才是我最终想要理解的。 - user189198$input
不能像数组一样进行索引。尝试这个:$Job = Start-Job -ScriptBlock { $input.getEnumerator()[0] } -InputObject @(1,2,3)
。 - jscottStart-Job -Name $name -ScriptBlock { $_argv = $input|%{$_}; $_argv[0], $_argv[1] | Write-Host } -InputObject @('arg1', 'arg2')
这样的事情。我遇到了问题,因为我认为-InputObject
意味着我可以传递一个Hashtable(我猜你仍然可以,但结果不会让你发疯)。应该称为-InputArray
或-InputEnumerable
或其他一些指示您无法真正传递“对象”的内容。 - Nathan Chappell