Ghi*_*102 5 powershell command-line-interface start-job
我正在尝试在 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]
Run Code Online (Sandbox Code Playgroud)
但是,无论我发送什么命令,powershell 命令似乎都永远不会完成。
我尝试生成一个 powershell 实例,如下所示:
powershell.exe -s
Run Code Online (Sandbox Code Playgroud)
这似乎也创建了一个似乎冻结的实例,没有执行或执行任何操作。在网上查找,我似乎找不到任何对 -s 参数的引用。
有谁知道它的用途或如何摆脱它以便我的起始工作正常工作?
编辑: -s 可能是 -sta 的简写,但我的命令不会使用 -sta 冻结,但会使用 -s 冻结。
Edit2:我后来发现 -s 是 -ServerMode 的简写,显然是旧版 Powershell 2.0 选项。我不知道为什么在使用 Start-Job 时添加它。
Edit3:我使用的命令是:
$deploymentsJobs += Start-Job -InitializationScript { SomeSmallFunction } (AnotherFunction) -ArgumentList $arg1, $arg2, $arg3}
Run Code Online (Sandbox Code Playgroud)
长话短说:
该-s选项是命令行的预期部分,用于通过新的 PowerShell 进程启动后台作业 - 它将新进程置于服务器模式,这是与调用进程进行通信以进行后台作业管理所必需的。
鉴于您描述的所有内容均符合预期,问题可能出在您通过-InitializationScript主脚本块运行的特定命令(隐含-ScriptBlock参数)。
正如您所发现的,调用会在幕后Start-Job产生powershell -s -NoLogo -NoProfile调用(可通过任务管理器发现)。
也就是说,创建一个新的 PowerShell 进程来在后台运行命令。
-EncodedCommand仅当您使用参数调用时,才会出现带有 Base64 编码命令字符串的Start-Process参数--Initialization主脚本块((隐含)-ScriptBlock参数)不通过命令行传递(见下文)。
-s在 PowerShell 内部始终使用 来调用后台作业,正如-s您还发现的那样, 是该开关的别名-servermode。(鉴于 only-STA已被记录,人们会期望它-s是 的缩写-STA,但事实并非如此)。
-s/-servermode是一个实现细节,仅由 PowerShell 本身使用,这就是它没有记录的原因。
GitHub 上 PowerShell Core 源代码中的此位置向您展示了如何构建后台进程的命令行。
服务器模式是后台进程必须处于的模式,以便通过其标准流(stdin、stdout、stderr)与调用进程进行通信:也就是说,在后台执行的命令通过其 stdin 发送到后台进程流,后台进程通过其 stdout 和 stderr 流报告其输出。[1]
请注意,基于 XML 的序列化/反序列化发生在进程间通信期间,使用与 PowerShell远程处理相同的基础设施- 请参阅此答案以获取更多信息。
[1] Ohad Schneider指出,如果主脚本块包含命令(例如Start-Process -NoNewWindow直接写入后台进程的 stdout 流的控制台程序),则可能会意外中断此通信 - 请参阅此答案。
| 归档时间: |
|
| 查看次数: |
1900 次 |
| 最近记录: |