powershell - 从没有作业信息的 Powershell 作业返回数据

标签 powershell powershell-3.0

我正在做一个看起来像这样的工作

$myjob =
{
  # regerate some $data
  return $data
}

我开始和接受我的工作是这样的:
Start-Job -ScriptBlock $myjob -Name "job1"
Wait-Job -Name "job1"
$result = Receive-Job -Job "job1"

现在我想要我的 $result仅包含 $data被退回了。但是,在检查时$result除了 $data 之外,我还看到了更多我不想包含在我的 $data 中的信息。大批。困惑的数据开始是这样的:

( 返回数据: )
State         : Running
HasMoreData   : True
StatusMessage : 
Location      : localhost
Command       :  # regerate some $data
                 return $data
JobStateInfo  : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : f7c63b33-d270-4fa8-8042-111edf9d86a6
Id            : 270
Name          : job1
ChildJobs     : {Job271}
PSBeginTime   : 03.12.2012 14:06:26
PSEndTime     : 
PSJobTypeName : BackgroundJob
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}

这一遍又一遍地重复,就像 20 次一样。之后我的真实$data被列出。但是:迭代 $result数组是不可能的。我能做什么?

最佳答案

您陷入了一个关于 powershell 的常见误解:脚本中所有未捕获的输出都返回给调用者,而不仅仅是“返回”的参数。例子:

ps> $s = {
    1..3 # write 1,2,3 to output stream
    return 4 # write 4 to output stream, then exit scriptblock!
    5 # won't be output
    return 6 # won't be output either
}

ps> & $s
1
2
3
4

return 语句用于提前退出函数,并可选择将一个或多个对象写入输出流(除了已经发出的其他输出)。

如果您不想获得输出,请使用以下语法之一:
$null = mycommand 
mycommand > $null
[void] (mycommand)

您在输出中看到两个额外的“作业”对象的原因是 start-jobwait-job分别返回创建和等待的作业对象。这样做的原因是允许流水线操作:
$results = start-job { ... } | wait-job | receive-job 

这里发生了什么事?那么,start-job创建作业并将其传递给 wait-job等待作业完成,然后将作业传递给 receive-job ,它返回结果并最终分配给 $results .

下列的?

关于powershell - 从没有作业信息的 Powershell 作业返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13684093/

相关文章:

Powershell - 为什么从库中下载此模块在服务器上失败?

powershell - 替换包含$个字符的字符串

powershell - 如何将 foreach 循环输出转储到 PowerShell 中的文件中?

sql - 使用 Powershell 从 SQL Server 2008 R2 导出到固定宽度的文本文件

powershell - 名称以〜开头的Powershell设置属性sh

powershell - 如何将数组的输出存储在文件中?

powershell - 列出谁对 PowerShell 中的文件夹具有完全控制权

powershell - 为什么 $hash.key 语法在 ExpandString 方法中不起作用?

powershell - Powershell选择类窗口事件/可见

xml - InnerXml 替换,但仅替换一次