我有一个主脚本,它试图针对从表中提取的服务器列表执行其他脚本。我希望这些额外的脚本可以异步调用。
这些额外的脚本需要一些我从生活中无法通过主脚本传递的参数。
子脚本都使用以下参数:
param(
[string]$sqlsrv=$null,
[string]$db=$null,
[string]$server=$null,
[string]$instance=$null
)
这些值由主脚本生成。我可以从命令行轻松调用任何子脚本,如下所示:
。\ serverstatus.ps1 test test1 test2 test3 其中test,test1,test2,test3是参数值。
我知道以异步方式调用这些子脚本的唯一方法是使用Start-Job。我无法让Start-Job接受我的参数。这似乎让我接近:
Start-Job serverstatus.ps1 $sqlsrv $db $server $instance
我收到此错误:
`Start-Job : Cannot bind parameter 'InitializationScript'.
Cannot convert the "TESTSERVER" value of type "System.String" to type System.Management.Automation.ScriptBlock".
At C:\SQLPS\ServerList.ps1:69 char:12
+ Start-Job <<<< serverstatus.ps1 $sqlsrv $db $server $instance
+ CategoryInfo : InvalidArgument: (:) [Start-Job], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.StartJobCommand`
我已经尝试了很多根据在线信息传递这些参数的方法。我似乎无法取得任何进展。非常感谢任何指导。
的 的 *编辑*
好的使用你的例子,我试图做同样的事情。这是我的结果。 Receive-Job的输出正在杀死我。我似乎无法从中获得任何有意义的东西。
ProcessServers.ps1
{Gathers a list of servers and instances}
Start-Job -FilePath .\serverstatus.ps1 -ArgumentList $sqlsrv,$destdb,$server,$instance
如果我只是在Start-Job行上写输出,则所有变量都按预期正确填充。输出如下:
Start-Job -FilePath .\GetServerDetails.ps1 -ArgumentList RADC00,ServerHistory,RADCHR01,RADCHR01
出于测试目的,我修改了GetServerDetails.ps1以简单地输出传递的参数。看起来如此:
GetServerDetails.ps1
param($sqlsrv,$db,$server,$instance)
"Parameters are: $sqlsrv, $destdb, $server, $instance"
所以从命令行我运行:
Start-Job -FilePath .\GetServerDetails.ps1 -ArgumentList RADC00,ServerHistory,RADCHR01,RADCHR01
而不是像你得到的输出,我得到了这个:
PS C:\SQLPS> Start-Job -FilePath .\GetServerDetails.ps1 -ArgumentList RADC00,ServerHistory,RADCHR01,RADCHR01
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
37 Job37 Running True localhost param($sqlsrv,$destdb,...
PS C:\SQLPS> Receive-Job -id 37
PS C:\SQLPS>
答案 0 :(得分:3)
使用-ArgumentList
上的Start-Job
参数传入您的参数。 ArgumentList
参数应该是该命令的最后一个参数,例如:
PS> Get-Content script.ps1
param($p1, $p2, $p3)
"p1 is $p1, p2 is $p2, p3 is $p3"
PS> Start-Job -FilePath .\script.ps1 -ArgumentList 1,"2",(get-date)
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Running True localhost param($p1, $p2, $p3)...
PS> Receive-Job -id 1
p1 is 1, p2 is 2, p3 is 03/11/2011 16:42:26