gpt4 book ai didi

PowerShell:Start-Job 中的 $input 到底是什么?

转载 作者:行者123 更新时间:2023-12-03 16:29:24 25 4
gpt4 key购买 nike

考虑以下代码。我只是传入一个 32 位有符号整数数组 [Int32[]]Start-Job cmdlet,通过使用 -InputObject范围。

$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 class 的文档,它有一个 ReadToEnd()方法。因此,以下代码应该可以工作:
$Job = Start-Job -ScriptBlock { $input.ReadToEnd(); } -InputObject @(1,2,3);
Wait-Job -Job $Job;
Receive-Job -Keep $Job;

但相反,我收到一条错误消息:

Method invocation failed because [System.Int32] does not contain a method named '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;

但是后来我收到了类似的错误消息:

Method invocation failed because [System.Management.Automation.PSInternalMemberSet] does not contain a method named 'ReadToEnd'. + CategoryInfo : InvalidOperation: (ReadToEnd:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound + PSComputerName : localhost



我注意到有一个 Microsoft Connect bug filed围绕着这种困惑,但它让我更加困惑。显然是 PipelineReader class 有一个名称困惑的属性 <>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;

最佳答案

大概 $input是一个枚举器,就像在标准管道中一样。
为了处理项目,我们应该使用 process
自动变量$_或通过 $input在另一个管道中 end块(如果未指定则为隐式)。

# process each item separately
$Job = Start-Job -ScriptBlock {process{$_}} -InputObject @(1,2,3);
Wait-Job -Job $Job;
Receive-Job -Keep $Job;

# process the whole $input
$Job = Start-Job -ScriptBlock {$input | %{$_}} -InputObject @(1,2,3);
Wait-Job -Job $Job;
Receive-Job -Keep $Job;

# compare with script blocks in standard pipelines

# each item
@(1,2,3) | . {process{$_}}

# whole input
@(1,2,3) | . {$input | %{$_}}

也许还有其他方法可以枚举 $input 的项目但他们是
据我所知,在实践中并不经常使用。

关于PowerShell:Start-Job 中的 $input 到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21100084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com