将其他脚本称为作业

时间:2011-03-11 21:33:38

标签: powershell

我有一个主脚本,它试图针对从表中提取的服务器列表执行其他脚本。我希望这些额外的脚本可以异步调用。

这些额外的脚本需要一些我从生活中无法通过主脚本传递的参数。

子脚本都使用以下参数:

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>

1 个答案:

答案 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