我正在尝试将函数的值(或更多但仅用于测试现在的函数)从函数传递给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中的函数。
答案 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