gpt4 book ai didi

powershell - 将其他脚本作为作业调用

转载 作者:行者123 更新时间:2023-12-01 21:09:18 25 4
gpt4 key购买 nike

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

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

子脚本都使用以下参数:

param(
[string]$sqlsrv=$null,
[string]$db=$null,
[string]$server=$null,
[string]$instance=$null
)

这些值由主脚本生成。我可以轻松地从命令行调用任何子脚本,如下所示:

.\serverstatus.ps1 测试 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>

最佳答案

使用 -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

关于powershell - 将其他脚本作为作业调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5278617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com