gpt4 book ai didi

powershell - *.ps1 脚本能否作为后台作业运行,自己执行 *.ps1 脚本?

转载 作者:行者123 更新时间:2023-12-02 23:31:50 25 4
gpt4 key购买 nike

我想运行一个脚本的 15 个实例,将 5 个脚本连接在一起,到目前为止我还没有看到小 Sprite 的灰尘。我将问题归结为一个测试用例,主脚本调用从属脚本,而从属脚本又调用 sub_slave 脚本(不需要管道来重现故障。)

如果 master.ps1 调用 slave.ps1,每个后台作业在 slave.ps1 调用 sub_slave.ps1 时无限期挂起。如果我将 slave.ps1 中对 sub_slave.ps1 的调用注释掉,master.ps1 将运行完成。如果我直接启动 slave.ps1,它会运行对 sub_slave.ps1 的调用就好了。这个问题似乎难以解决,但如果我尝试双链。我在文档中没有看到任何内容说您不能将这些脚本菊花链式地链接到任意深度,但也许我的阅读不够深入?

您将看到我通过将内容添加到一个简单的文本文件来跟踪脚本的进度。

d:\jobs\master.ps1

$indexes = @(0,1,2)

$initString = "cd $pwd"
$initCmd = [scriptblock]::create($initString)

set-content -path out.txt -value "Master started"
foreach ($index in $indexes)
{
add-content -path out.txt -value "job starting"
start-job -filepath slave.ps1 -InitializationScript $initCmd -ArgumentList @("master index $index originated")
}

add-content -path out.txt -value "master completed"

d:\jobs\slave.ps1
#requires -version 2.0

param (
[parameter(Mandatory=$false)]
[string]$message = "slave_originated"
)

begin
{
Set-StrictMode -version Latest
add-content -path out.txt -value "slave beginning in $pwd"
}

process
{
add-content -path out.txt -value "slave processing $message"
invoke-expression "D:\jobs\sub_slave.ps1 -message $message"
}

end
{
add-content -path out.txt -value "slave ending"
}

d:\jobs\sub_slave.ps1
#requires -version 2.0
param (
[parameter(Mandatory=$false)]
[string]$message = "sub_slave originated"
)

begin
{
Set-StrictMode -version Latest

add-content -path out.txt -value "sub_slave beginning"
}

process
{
add-content -path out.txt -value "sub_slave processing $message"
}

end
{
add-content -path out.txt -value "sub_slave ending"
}

当代码按编写的方式运行时,没有任何注释,我在 out.txt 中得到了这个:
d:\jobs\out.txt
Master started
job starting
job starting
job starting
master completed
slave beginning in D:\jobs
slave processing master index 0 originated
slave beginning in D:\jobs
slave processing master index 1 originated
slave beginning in D:\jobs
slave processing master index 2 originated

请注意,每条告别消息之后的下一个命令是对 sub_slave.ps1 的调用,并且根本没有来自 sub_slave.ps1 的消息出现。系统将挂起 3 个 powershell.exe 进程永远愉快地运行。 Get-job 报告 3 个进程仍在运行和 HasMoreData。

我得到的唯一线索是,如果我崩溃转储挂起的进程,我会看到:
Number of exceptions of this type:        2
Exception MethodTable: 79330e98
Exception object: 012610fc
Exception type: System.Threading.ThreadAbortException
Message: <none>
InnerException: <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80131530
-----------------

Number of exceptions of this type: 2
Exception MethodTable: 20868118
Exception object: 01870344
Exception type: System.Management.Automation.ParameterBindingException
Message: System error.
InnerException: <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80131501
-----------------

也许我有某种参数问题?如果我从 sub_slave.ps1 中删除所有参数,则行为不会改变,所以我有点怀疑,但这是可能的。我愿意接受任何想法。

最佳答案

您调用 sub_slave.ps1 是错误的。这个:

invoke-expression "D:\jobs\sub_slave.ps1 -message $message" 

应该是这样的:
D:\jobs\sub_slave.ps1 -message $message

该消息正在得到评估并成为多个参数。

关于powershell - *.ps1 脚本能否作为后台作业运行,自己执行 *.ps1 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5186384/

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