在使用PowerShell的Start-Job命令时,-s参数的含义是什么?

5

我想在PowerShell中调用Start-Job。这样做时,它会生成一个带有以下参数的后台PowerShell:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Version 5.0 -s -NoLogo -NoProfile -EncodedCommand [encoded command I want to run in base64]

然而,无论我发送什么命令,powershell命令似乎永远无法完成。

我尝试像这样生成一个powershell实例:

powershell.exe -s

这似乎创建了一个看起来被冻结的实例,不执行任何操作。在网上搜索,我似乎找不到关于-s参数的任何参考。

有人知道它是什么或如何消除它,以便我的start-jobs正常工作吗?

编辑:可能-s是-sta的简写,但是使用-sta我的命令不会冻结,但使用-s会。

编辑2:我后来发现,-s是-ServerMode的简写,显然是Legacy Powershell 2.0选项。我不知道为什么在使用Start-Job时会添加该选项。

编辑3:我使用的命令是:

$deploymentsJobs += Start-Job -InitializationScript { SomeSmallFunction } (AnotherFunction) -ArgumentList  $arg1, $arg2, $arg3}

我感激你,@Ghi102 - mklement0
1个回答

5
简述:在通过新的PowerShell进程启动后台作业时,-s选项是命令行中预期的一部分。它将新进程置于服务器模式,这是与调用进程进行后台作业管理所必需的。尽管不是遗留选项,但也没有记录,因为它仅由PowerShell内部使用。如果您运行的特定命令是预期的,则问题可能出现在通过-InitializationScript和主脚本块(隐含的-ScriptBlock参数)运行的特定命令上。当调用Start-Job时,会在幕后生成一个powershell -s -NoLogo -NoProfile调用,即创建一个新的PowerShell进程以在后台运行命令。如果使用Base64编码的命令字符串调用-EncodedCommand参数,则只有在使用-Initialization参数调用Start-Process时才会存在。-s / -servermode是一个实现细节,仅由PowerShell本身使用,这就是为什么它没有记录的原因。在“服务器模式”下,后台进程必须能够通过其标准流(stdin、stdout、stderr)与调用进程通信。
请注意,在此进程间通信过程中,使用与 PowerShell 远程相同的基础设施进行基于 XML 的序列化/反序列化 - 有关更多信息,请参见此答案

[1] Ohad Schneider 指出,如果主脚本块包含命令(例如 Start-Process -NoNewWindow)以及直接向后台进程的 stdout 流写入的控制台程序,则可能会意外破坏此通信 - 请参见此答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接