Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何在开始作业中通过引用传递变量?_Powershell_Parameters_Pass By Reference - Fatal编程技术网

Powershell 如何在开始作业中通过引用传递变量?

Powershell 如何在开始作业中通过引用传递变量?,powershell,parameters,pass-by-reference,Powershell,Parameters,Pass By Reference,如何修改开始作业中的变量?此代码输出0,似乎是因为变量通过值传递: $vara = "0" $j = start-job -ScriptBlock { $args[0] = "1" } -ArgumentList $vara wait-job $j > $null receive-job $j Write-Host $vara ## => "0" 如何通过引用传递参数(因此,输出1)?在作业中修改任何内容时,您完全超出了范围。任何东西都不会在当前会话中神奇地填充 你可

如何修改
开始作业
中的变量?此代码输出
0
,似乎是因为变量通过值传递:

$vara = "0"

$j = start-job -ScriptBlock {
   $args[0] = "1"
} -ArgumentList $vara

wait-job $j > $null
receive-job $j

Write-Host $vara  ## => "0"

如何通过引用传递参数(因此,输出
1
)?

在作业中修改任何内容时,您完全超出了范围。任何东西都不会在当前会话中神奇地填充

你可以这样做:

$vara = "0"

$j = start-job -ScriptBlock {
   "1"
} -ArgumentList $vara

wait-job $j > $null
$vara = receive-job $j

Write-Host $vara
$vara = "0"

$j = start-job -ScriptBlock {
   [pscustomobject]@{
      vara1 = "1"
      vara2 = "0"
    }
} -ArgumentList $vara

wait-job $j > $null
$vara = receive-job $j

Write-Host $vara.vara1
如果需要填充大量参数,可以执行以下操作:

$vara = "0"

$j = start-job -ScriptBlock {
   "1"
} -ArgumentList $vara

wait-job $j > $null
$vara = receive-job $j

Write-Host $vara
$vara = "0"

$j = start-job -ScriptBlock {
   [pscustomobject]@{
      vara1 = "1"
      vara2 = "0"
    }
} -ArgumentList $vara

wait-job $j > $null
$vara = receive-job $j

Write-Host $vara.vara1

我以为我知道,但我所知道的都不管用。一种非常低效的方法是将变量保存到文件中,然后从文件中提取它们。乔布斯在他们自己版本的powershell中,这就是为什么它变得棘手的原因。我尝试了全局、本地、私有、脚本等。。似乎没有人将其传递回脚本。@RobertCotterman是的,也考虑过使用文件。但我们希望微软能实现这样一个基本的pass-by-ref…我想你想要的是“同步变量”。看看这篇文章。。。在PowerShell运行空间之间共享变量和活动对象|了解PowerShell |实现更多-@Lee_Dailey这是否真的可以让您在父会话和子会话之间同步变量?您可以通过运行空间修改父变量吗?我以为它是为了在多个孩子之间同步变量。例如,也许你创造了100个工作岗位,并希望环境保持不变。@JacobColvin-从我所知的一点来看,是的。请看链接文章中的这句话。。。“我还将父主机运行空间添加到子运行空间中,以便使用WriteEverBoseline()方法将值写入父会话。”///////不幸的是,我不了解实际发生的情况。在我看来,这似乎是OP想要的。这是一个很好的解决办法+1但是这种只使用返回值的技巧对于作业内部的复杂算法可能不太有用。或用于并行性和在作业结束前修改值。没有按引用传递机制吗?您可以使用
$using:
范围,但不能设置这些变量。通常,您应该始终使用我的方法2组装输出。无论如何,这只是最好的做法。