AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 805314
Accepted
Kedare
Kedare
Asked: 2016-09-27 02:47:25 +0800 CST2016-09-27 02:47:25 +0800 CST 2016-09-27 02:47:25 +0800 CST

Powershell 工作流:工作流被终止活动终止

  • 772

我有一个 PowerShell 脚本,它使用 Powershell 工作流在多个远程服务器上同时运行许多 msdeploy。

一切正常,除了在每个“Foreach -Parallel”循环结束时,我得到这个异常:

Microsoft.PowerShell.Utility\Write-Error : The workflow was terminated by a Terminate activity.
At Execute-Bootstrapper:28 char:28
+ 
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WorkflowReturnException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Workflow.WorkflowReturnException,Microsoft.PowerShell.Commands.Writ 
   eErrorCommand
    + PSComputerName        : [localhost]

我怎样才能解决这个问题 ?是否有结束工作流程的特定方法?

这是与并行执行相关的部分:

foreach -Parallel ($remoteHost in $selectedHosts) {
    if($Env:FULL -eq "true") {
        $process = Start-Process -PassThru -Wait -NoNewWindow "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" "xxx --full"
    } else {
        $process = Start-Process -PassThru -Wait -NoNewWindow "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" "xxx"
    }
    if($process.ExitCode -ne 0) {
        Exit $process.ExitCode
    }
}

谢谢你。

windows powershell
  • 1 1 个回答
  • 1446 Views

1 个回答

  • Voted
  1. Best Answer
    JosefZ
    2017-01-27T12:38:26+08:002017-01-27T12:38:26+08:00

    工作流与 Windows PowerShell 不同……工作流可能看起来像一个具有不同关键字的函数,但是……不要被愚弄了 — 了解工作流的最重要一点是它们看起来像 Windows PowerShell,但实际上并非如此。

    资料来源:工作流程:基础知识(在“嘿,脚本专家!博客”的工作和工作流程主文章下)。

    以下部分注释的脚本可能会有所帮助。使用传递给的非常简单的参数进行测试MSDeploy.exe,使得

    • -help -verb有效,退出代码 = 0 而其他
    • -help -brew-help -bubu不是,退出代码= -1 。
    • 另请注意,-NoNewWindow如果没有-RedirectStandardOutput并且-RedirectStandardError会引发以下错误(考虑完全省略-NoNewWindow参数):

    Microsoft.PowerShell.Utility\Write-Error: 后台进程处理数据时出错。报告错误:无法处理节点类型为“文本”的元素。仅支持 Element 和 EndElement 节点类型。

    workflow procWorkflow {
    
        ## workflow parameter
        param( $selectedHosts )
    
        ## $using: prefix allows us to call items that are in the workflow scope
        ##         but not in the function / inlinescript scope.
        Function myStartProcess {
            param( [string] $lineargs )
            $process = Start-Process `
                -FilePath "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" `
                -PassThru -Wait -NoNewWindow `
                -RedirectStandardOutput "$env:TEMP\$using:remoteHost`Out.txt" `
                -RedirectStandardError  "$env:TEMP\$using:remoteHost`Err.txt" `
                -ArgumentList $lineargs
            $process.ExitCode                  # function return value
        }
        ## parallel foreach loop on workflow parameter
        foreach -Parallel ($remoteHost in $selectedHosts) {
            if($Env:FULL -eq "true") {
                # omitted as I know that there is no $Env:FULL variable defined on my comp
            } else {
                $processEx = myStartProcess "-help -$remoteHost"
                ###              tried instead above function call:
                ### $lineargs = "-help -$remoteHost"
                ### $process  = Start-Process -FilePath "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -PassThru -Wait -NoNewWindow -RedirectStandardOutput "$env:TEMP\$remoteHost`Out.txt" -RedirectStandardError "$env:TEMP\$remoteHost`Err.txt" -ArgumentList $lineargs
                ###     and then tried following output alternatives:
                ### $processEx = $process.ExitCode            # null  !!!
                ### $processEx = $process.HasExited           # false !!!
                ### $processEx = $process.GetType().FullName  # System.Management.Automation.PSObject
                ### $processEx = $process                     # System.Diagnostics.Process (msdeploy)
            }
            Write-Output  @{ $remoteHost = $processEx }  # workflow return value
        }
    }
    

    上面的工作流返回一个哈希表数组(大致hostname: exitcode成对),因为一个简单的退出代码是不够的,因为输出顺序是随机的,因为它是并行运行的。

    ## example call to above workflow would look like
    $procWorkflow = procWorkflow 'verb','brev','bubu'
    
    ## example output processing
    "`n=== procWorkflow raw:"
    $procWorkflow
    
    "`n=== procWorkflow processed:`n"
    for ($i=0; $i -lt $procWorkflow.Count; $i++) {
        $procWorkflow[$i].Keys | ForEach-Object {
            $procExitcode = $procWorkflow[$i][$_]
            if ( $procExitcode -eq 0 ) {
                $procOutFile = Get-Item "$env:TEMP\$_`Out.txt"
            } else {
                $procOutFile = Get-Item "$env:TEMP\$_`Err.txt"
            }
            '{0,-6} {1,6} {2,12}    {3}' -f 
                $_, $procExitcode, $procOutFile.Length, $procOutFile.Name
        }
    }
    

    输出:

    PS D:\PShell> D:\PShell\SF\805314_workflow.ps1
    
    === procWorkflow raw:
    
    Name                           Value                                                 
    ----                           -----                                                 
    bubu                           -1                                                    
    brev                           -1                                                    
    verb                           0                                                     
    
    === procWorkflow processed:
    
    bubu       -1           56    bubuErr.txt
    brev       -1           56    brevErr.txt
    verb        0          537    verbOut.txt
    
    • 2

相关问题

  • 知道任何适用于 Windows 的快速可编写脚本的 ftp 客户端吗?[关闭]

  • 如果 Windows 服务崩溃,如何自动重新启动它?

  • 无法安排任务(访问被拒绝)

  • 物理机重启时自动重启虚拟机(VMWare)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve