尝试将变量传递给PowerShell函数,然后作为Start-Job运行

时间:2017-05-17 21:29:53

标签: powershell powershell-v3.0 powershell-v4.0

我正在尝试将函数的值(或更多但仅用于测试现在的函数)从函数传递给Powershell Start-Job。

如果使用invoke-expression,这有效,但我必须摆脱|如果传递给起始作业,则为out-string。

使用:

$thecomp = "127.0.0.1"

$func = {$compr = $thecomp; function TestConnection {Test-Connection -ComputerName $compr}  }  | Out-String

invoke-expression $func 

TestConnection

这不起作用,注意$ func行的差异:

$thecomp = "127.0.0.1"

$func = {$compr = $thecomp; function TestConnection {Test-Connection -ComputerName $compr}  } 

Start-Job -Name testjob -InitializationScript $func -ScriptBlock {TestConnection} -ArgumentList $compr,$thecomp | Out-Null

Wait-Job -Name testjob | Out-Null

Receive-Job -Name testjob  

Remove-Job *


无论是本地计算机还是远程计算机,我都会得到同样的错误:

  

无法验证参数'ComputerName'的参数。争论是   null或空。提供一个非null或空的参数,然后   再次尝试该命令。       + CategoryInfo:InvalidData :( :) [Test-Connection],ParameterBindingValidationException       + FullyQualifiedErrorId:ParameterArgumentValidationError,Microsoft.PowerShell.Commands.TestConnectionCommand       + PSComputerName:localhost


我尝试了很多不同的东西,包括使用-ArgumentList和其他东西。我真的不知道我错过了什么。如果我在运行上面的命令后请求ISE中的变量$ compr和$ thecomp,我得到了IP,但它没有传递给Start-Job中的函数。

1 个答案:

答案 0 :(得分:0)

我使用不同的方法工作。这就是我正在做的事情。

$system = '127.0.0.1'

$func = {
          param ([string]$system)
          Process {Test-Connection -ComputerName $system } 
        }

Start-Job -Name testjob -ScriptBlock $func -ArgumentList $system | Out-Null

Wait-Job -Name testjob | Out-Null
Receive-Job -Name testjob 
Remove-Job *


似乎该函数不再明确命名,而是与定义它的变量一起调用或使用。


这也适用于我原本想要做的事情。

$system = '127.0.0.1'
$func = {function TestConnection ($system) {Test-Connection -ComputerName $system } } # | Out-String
Start-Job -Name testjob -InitializationScript $func -ScriptBlock {TestConnection $args} -ArgumentList $system  | Out-Null