`

WF4.0 Beta1之旅(7):WF调用PowerShell

阅读更多

在WF4 beta1中与PowerShell交互提供了两个活动InvokePowerShell和InvokePowerShell<T>活动

InvokePowerShell:调用一个不包含返回值的PowerShell cmdlet。InvokePowerShell可以用来调用简单的cmdlets和脚本。我们还可以向cmdlet传递参数和输入对象。执行之后,此活动会提供一组错误信息(如果发生错误的话)。

InvokePowerShell<T>:此活动调用PowerShell cmdlet,并接收返回的结果。这种类型的活动都要比非泛型版本多一个InitializationAction。InitializationAction用来将cmdlet的执行结果隐射到工作流的变量。

下面就举例说明这个两个活动如何使用,下面的例子中我们完成如下功能,输入一个进程名,然后调用powershell停止该进程,在获取最新的所有进程并显示出来,我们首先来完成几个自定义活动:

1.用于接收输入的活动ReadLine,如下:

namespace CaryPowerShell
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Activities;

    public class ReadLine : NativeActivity
    {
        public OutArgument<string> Result { get; set; }
        public InArgument<string> BookmarkName { get; set; }

        protected override void Execute(ActivityExecutionContext context)
        {
            string name = this.BookmarkName.Get(context);
            if (name == null)
            {
                throw new Exception(string.Format("ReadLine {0}: 书签不能为空",this.DisplayName));
            }
            context.CreateNamedBookmark(name, new BookmarkCallback(OnReadComplete));
        }
        void OnReadComplete(ActivityExecutionContext context, Bookmark bookmark, object state)
        {
            string input = state as string;
            context.SetValue(this.Result, input);
        }
    }
}
2.用于输出进程信息的活动PrintResult,如下:
namespace CaryPowerShell
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Activities;

    public class PrintResult<T> : CodeActivity<T>
    {
        public InArgument<ICollection<T>> Collection { get; set; }

        protected override void Execute(CodeActivityContext context)
        {
            ICollection<T> underlyingCollection = this.Collection.Get<ICollection<T>>(context);
            if (underlyingCollection.Count == 0)
            {
                Console.WriteLine("没有进程");
            }
            else
            {
                foreach (T obj in underlyingCollection)
                {
                    Console.WriteLine(obj.ToString());
                }
            }
        }
    }
}
3.获取进程的活动GetProcesses,使用的是泛型版本的InvokePowerShell<T>,如下图:
clip_image002
4.停止进程的活动StopProcess,使用的是InvokePowerShell活动,如下图:
clip_image002[5]
5.我们设计的工作流如下图:
clip_image002[7]
6.宿主程序如下:
namespace CaryPowerShell
{
    using System;
    using System.Linq;
    using System.Threading;
    using System.Activities;
    using System.Activities.Statements;

    class Program
    {
        static void Main(string[] args)
        {
            bool running = true;

            AutoResetEvent syncEvent = new AutoResetEvent(false);

            WorkflowInstance myInstance = new WorkflowInstance(new Sequence1());

            myInstance.OnCompleted = delegate(WorkflowCompletedEventArgs e)
            {
                running = false;
                syncEvent.Set();
            };

            myInstance.OnIdle = delegate()
            {
                syncEvent.Set();
                return IdleAction.Nothing;
            };

            myInstance.OnUnhandledException = delegate(WorkflowUnhandledExceptionEventArgs e)
            {
                Console.WriteLine(e.UnhandledException.ToString());
                return UnhandledExceptionAction.Terminate;
            };

            myInstance.OnAborted = delegate(WorkflowAbortedEventArgs e)
            {
                Console.WriteLine(e.Reason);
                syncEvent.Set();
            };

            myInstance.Run();

            // main loop (manages bookmarks)
            while (running)
            {
                if (!syncEvent.WaitOne(10, false))
                {
                    if (running)
                    {
                     
                        if (myInstance.GetAllBookmarks().Count > 0)
                        {
                            string bookmarkName = myInstance.GetAllBookmarks()[0].BookmarkName;
                            myInstance.ResumeBookmark(bookmarkName, Console.ReadLine());
                            syncEvent.WaitOne();
                        }
                    }
                }
            }

            System.Console.WriteLine("工作流执行结束");
            System.Console.ReadKey();
        }
    }
}

7.运行结果如下:

clip_image002[9]

8.相关文章:

WF4.0 Beta1之旅(1):基本介绍
WF4.0 Beta1之旅(2):异常处理
WF4.0 Beta1之旅(3):全新的FlowChart
WF4.0 Beta1之旅(4):Bookmark的使用
WF4.0 Beta1之旅(5):规则引擎的变化
WF4.0 Beta1之旅(6):自定义活动

分享到:
评论

相关推荐

    powershell4.0完整升级包(windows powershell升级补丁系统4.0版本)

    powershell4.0完整升级包(windows powershell升级补丁系统4.0版本) windows08R2 powershell升级到4.0的完整升级包,包含所有需要的依赖包。 注意:只适用于08R2系统; 另外:powershell4.0功能强大 可以批量添加AD域...

    powershell4.0完整升级包

    windows08R2 powershell升级到4.0的完整升级包,包含所有需要的依赖包。 注意:只适用于08R2系统; 另外:powershell4.0功能强大 可以批量添加AD域用户及exchange邮箱账号

    powershellpuls4.0(x64)

    PowerShell 4.0 支持工作流(Workflow),这是一种基于Windows Workflow Foundation (WF) 的强大功能。工作流可以将复杂的任务分解为一系列步骤,允许并发执行和错误处理,非常适合长时间运行的任务和跨多个系统...

    PowerShell 4.0:提升任务自动化.docx

    PowerShell 4.0是Windows Server 2021 R2和Windows 8.1引入的一个重要更新,显著提升了任务自动化的效率和安全性。这一版本的PowerShell在多个方面进行了改进,包括期望状态配置(Desired State Configuration, DSC...

    exchange/powershell,Java调用powershell开通邮箱

    标题 "exchange/powershell,Java调用powershell开通邮箱" 暗示了这是一个关于使用Java编程语言调用PowerShell脚本在Exchange服务器上创建邮箱的教程或项目。Exchange是微软提供的一款企业级电子邮件服务器软件,而...

    powerbi-powershell:通过PowerShell调用Power BI REST API的示例

    使用PowerShell调用Power BI REST API的示例。 Microsoft Power BI PowerShell示例 介绍 此存储库包含使用PowerShell调用Power BI REST API的示例。 每个PowerShell脚本都是自记录的。 触发计划的刷新并检查刷新...

    Windows6.1-KB2819745-x64-MultiPkg_powershell 4.0.msu.zip

    《Windows PowerShell 4.0:深入解析与应用》 Windows PowerShell 4.0 是微软推出的一个强大命令行脚本环境,它为系统管理员和开发者提供了更高效、更灵活的工具来管理和自动化Windows操作系统。该版本的PowerShell...

    Windows PowerShell系列课程(1):PowerShell概览及使用技巧

    **Windows PowerShell系列课程(1):PowerShell概览及使用技巧** Windows PowerShell是Microsoft开发的一种命令行外壳程序和脚本环境,专为系统管理员和高级用户设计,旨在增强对Windows操作系统的管理和自动化能力...

    Powershell调用入口的优先级.docx

    ### Powershell调用入口的优先级 在PowerShell中,当执行某个命令时,系统会按照一定的优先级顺序来查找并执行相应的命令处理程序。理解这些优先级规则对于有效地使用PowerShell至关重要。本文将详细介绍PowerShell...

    C#调用PowerShell

    它具有强大的功能,其中之一就是能够调用其他系统组件,如PowerShell。PowerShell是一种命令行shell和脚本语言,由Microsoft开发,旨在增强系统管理员对操作系统及应用程序的管理能力。本文将深入探讨如何在C#中调用...

    java 调用 powershell 并传参 返回

    java 调用 powershell 并传参 返回

    java+powershell 控制windows

    1. **调用 PowerShell 命令**: 在 Java 中,我们可以使用 `java.lang.Runtime.getRuntime().exec()` 方法来执行外部命令。对于 PowerShell,我们需要先启动 PowerShell 进程,然后执行相应的命令。例如,调用 `...

    PowerShell调用WebService

    本篇文章将深入探讨如何使用PowerShell调用WebService,这是一项基础且实用的技能,尤其是在自动化任务和系统集成中。 首先,让我们理解WebService是什么。WebService是一种基于Web的、标准化的接口,它允许不同...

    Windows PowerShell系列课程(1):PowerShell概览及使用技巧_Video

    5. **PowerShell版本兼容性**: PowerShell有多个版本,从最初的1.0到最新的7.x,需要注意不同版本之间的API差异和兼容性问题。 6. **社区和资源**: PowerShell有一个庞大的社区,包括论坛、博客、GitHub上的开源...

    Windows PowerShell系列课程(3):PowerShell在实际应用中的操作

    1. **PowerShell基础概念**:了解PowerShell的工作原理,包括其与传统CMD的区别、PowerShell的核心组件如Cmdlets(命令)、Providers(提供者)和Session State(会话状态)。 2. **PowerShell语法**:掌握...

    WINDOWS POWERSHELL 4.0 LANGUAGE QUICK REFERENCE - 4页

    Windows PowerShell 4.0是一种强大的命令行环境,用于管理和自动化Windows操作系统及相关的应用程序。它引入了许多功能和操作符,使得脚本编写和任务自动化变得更加高效。以下是对标题和描述中涉及的一些关键知识点...

    最新版: PowerShell-7.4.3-win-x64.msi

    PowerShell-7.4.3-win-x64.msi 安装 PowerShell 是微软开发的一种命令行 shell 和脚本语言,它设计用于系统管理任务和自动化。相比传统的命令提示符(CMD),PowerShell 提供了更强大、灵活的功能集,特别是对于...

    Windows PowerShell 4.0 for .NET Developers 无水印pdf

    Windows PowerShell 4.0 for .NET Developers 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权...

    PowerShell 4.0-新增功能?

    1. ** Desired State Configuration (DSC)**: DSC是PowerShell 4.0引入的一项核心功能,它提供了一种声明式的方法来管理Windows服务器的配置。DSC允许管理员定义期望的系统状态,并自动维护这些状态,确保系统的合规...

Global site tag (gtag.js) - Google Analytics