gpt4 book ai didi

powershell - Start-Process 不执行后 Job 脚本 block 中的代码

转载 作者:行者123 更新时间:2023-12-04 01:42:38 24 4
gpt4 key购买 nike

当我使用 PowerShell 5.1 创建自动化脚本时,我遇到了一个问题 – 在作业的脚本 block 中,Start-Process 之后的代码将没有机会执行。这是一个简单的重现:

第一步>>为Start-Process准备一个.cmd文件,callee.cmd中的代码为:

@echo off
echo "Callee is executing ..."
exit /B 0

第 2 步 >> 准备 PowerShell 代码,

$scriptBlock = {
$res = Start-Process -FilePath "cmd.exe" -Wait -PassThru -NoNewWindow -ArgumentList "/c .\callee.cmd"
throw "ERROR!"
}

$job = Start-Job -ScriptBlock $scriptBlock
Wait-Job $job
Receive-Job $job
Write-Host($job.State)

第 3 步 >> 运行 PowerShell 脚本,屏幕上的输出为:

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Completed True localhost ...
Completed

预期值应为“失败”。我的代码有问题还是我使用作业的方式不对?

最佳答案

Start-Job 在所谓的服务器模式 中在单独的 PowerShell 进程中运行作业。在此模式下,PowerShell 作业进程使用标准输入和输出流与父进程交换消息。

Start-Process cmdlet 的

-NoNewWindow 参数指示它将生成的控制台子进程连接到其父进程的标准流。

因此,在 PowerShell 作业中使用 Start-Process -NoNewWindow,将派生的 cmd.exe 进程连接到相同的流,PowerShell 作业进程使用该流交换消息有自己的父进程。

现在,当生成的 cmd.exe 向其标准输出流中写入内容时,它会干扰 PowerShell 作业进程与其父进程之间的正常消息交换,从而导致一些意外行为。

关于powershell - Start-Process 不执行后 Job 脚本 block 中的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45764330/

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