Powershell commands 祥解之 Add-Type

    Add-Type,巨强悍的一个东西
用途
    添加一个新的.NET类型到当前会话中去。支持C#,vb,javascript,dll...
例子1,通过代码添加新类型
         C:/PS>$source = @"
    public class BasicTest
    {
        public static int Add(int a, int b)
        {
            return (a + b);
        }
   
        public int Multiply(int a, int b)
        {
            return (a * b);
        }
    }
    "@
   
    C:/PS> Add-Type -TypeDefinition $source
   
    C:/PS> [BasicTest]::Add(4, 3)
   
    C:/PS> $basicTestObject = New-Object BasicTest
    C:/PS> $basicTestObject.Multiply(5, 2)
将一段代码作为一种类型添加到当前会话当中去。
例子2,添加vb类型    
    C:/PS>add-type -path c:/ps-test/Hello.vb    
    [VBFromFile]::SayHello(", World")   
    # From Hello.vb
    Public Class VBFromFile
    Public Shared Function SayHello(sourceName As String) As String
    Dim myValue As String = "Hello"
    return myValue + sourceName
    End Function
    End Class
   
    C:/PS> [VBFromFile]::SayHello(", World")
    Hello, World

<think>好的,我现在需要帮助用户理解C#中使用RunspaceFactory创建Runspace并执行Pipeline.AddScript的PowerShell代码示例。首先,我要回顾用户提供的引用内容,特别是引用[1]、[2]、[3],以及用户之前的问题历史。 用户之前的问题是关于C#中SetBrightness方法的参数,现在转向了如何在C#中调用PowerShell脚本,特别是使用Runspace和Pipeline.AddScript。用户提供的引用[1]中的代码示例展示了使用RunspaceFactory创建Runspace,并通过Pipeline的AddScript方法添加PowerShell命令。引用[2]和[3]则涉及处理PowerShell的确认提示和参数传递的问题。 首先,我需要解释Runspace、Pipeline和AddScript的基本概念。Runspace是PowerShell的执行环境,类似于一个容器,用于托管命令的执行。Pipeline则用于构建和执行一系列命令,AddScript用于向Pipeline添加脚本块。用户可能不太清楚这些组件之间的关系以及它们如何协同工作。 接下来,我需要详细解析用户提供的代码示例。代码中使用了using语句来管理Runspace的资源,确保正确释放。然后打开Runspace,创建Pipeline,并多次调用AddScript来添加PowerShell命令。这里需要注意的是,每次AddScript调用都添加了一个独立的命令,这可能效率不高,更好的做法是将多个命令合并成一个脚本块,减少调用次数。 然后,要解释为什么使用AddScript而不是AddCommand。根据引用[1],用户提到在C#中调用PowerShell时,Add可能不好使,应该用AddScript。AddScript用于添加完整的脚本代码,而AddCommand用于添加单个命令。例如,添加包含多个语句或复杂逻辑的脚本时,AddScript更合适。此外,如果脚本需要参数,可以通过AddScript传递,并在脚本中使用参数变量,如引用[3]中提到的参数传递方法。 还要提到引用[2]中处理确认提示的问题,即设置环境变量ConfirmPreference为None来跳过确认步骤。这可能与用户的问题相关,因为在执行某些PowerShell命令时,系统可能会要求确认,影响自动化流程。 另外,用户可能关心如何传递参数给PowerShell脚本。引用[3]中的示例展示了如何将参数传递给脚本文件,可以通过在AddScript的脚本字符串中包含参数变量,或者在C#中构建参数字符串。需要解释如何在AddScript中处理参数,比如使用字符串拼接或者更安全的方式转义参数。 最后,总结代码示例的功能,即该代码通过C#调用PowerShell,获取SharePoint的Web应用信息并显示。需要指出可能的改进点,比如合并多个AddScript调用,使用参数化脚本提高可维护性,以及错误处理和资源管理的重要性。 在回答过程中,要确保使用正确的中文术语,结构清晰,分步骤解释每个组件的作用,并结合用户提供的代码示例进行说明。同时,需要生成相关问题,帮助用户深入理解相关主题,比如如何优化脚本执行、处理错误、传递参数等。</think>### C# 调用 PowerShell 代码解析(基于引用[1][2][3]) #### 一、核心组件功能说明 1. **`Runspace` 运行空间** PowerShell 的执行容器,相当于隔离的脚本执行环境[^1]。 ```csharp using (Runspace runspace = RunspaceFactory.CreateRunspace()) { runspace.Open(); // 必须显式打开运行空间[^1] } // 自动释放资源 ``` 2. **`Pipeline` 管道** 命令执行通道,支持多命令串联执行(类似Linux管道符 `|`)[^1]。 ```csharp Pipeline pipeline = runspace.CreatePipeline(); ``` 3. **`AddScript()` 方法** 向管道添加完整脚本代码(相比 `AddCommand()` 更适合复杂操作)[^1][^3]: ```csharp pipeline.Commands.AddScript("Add-PSSnapin Microsoft.SharePoint.PowerShell"); ``` #### 二、代码执行流程详解 ```csharp // 步骤1:创建运行空间 using (Runspace runspace = RunspaceFactory.CreateRunspace()) { try { runspace.Open(); // 步骤2:创建管道 Pipeline pipeline = runspace.CreatePipeline(); // 步骤3:加载SharePoint管理单元(关键配置) pipeline.Commands.AddScript("Add-PSSnapin Microsoft.SharePoint.PowerShell"); // 步骤4:执行命令并获取结果 Collection<PSObject> results = pipeline.Invoke(); // 步骤5:解析输出 foreach (PSObject result in results) { MessageBox.Show(result.ToString()); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } ``` #### 三、技术细节对比 | 方法 | 适用场景 | 参数处理能力 | 示例 | |-----------------|---------------------------------|-------------------------|--------------------------------------| | **AddScript()** | 执行多行脚本/复杂逻辑 | 支持脚本内变量定义[^3] | `AddScript("$a=5; Get-Process -Id $a")` | | **AddCommand()**| 执行单个命令 | 需配合Parameters方法[^3] | `AddCommand("Get-Process").AddParameter("Id", 5)` | #### 四、关键优化方案 1. **脚本合并优化** 将多个 `AddScript()` 合并提升性能: ```csharp // 原始写法(低效) pipeline.Commands.AddScript("$webApplications = Get-SPWebApplication"); pipeline.Commands.AddScript("$webApplicationUrls = $webApplications.url"); // 优化写法(高效) pipeline.Commands.AddScript(@" $webApplications = Get-SPWebApplication $webApplicationUrls = $webApplications.url $webApplicationUrls # 输出结果 "); ``` 2. **参数安全传递**(参考引用[3]) 使用参数化脚本避免注入风险: ```csharp string siteName = "Contoso"; pipeline.Commands.AddScript(@" param($site) Get-SPSite -Identity $site ").AddArgument(siteName); ``` 3. **跳过确认提示**(参考引用[2]) 修改运行空间环境变量: ```csharp runspace.SessionStateProxy.SetVariable("ConfirmPreference", "None"); ``` #### 五、执行原理示意图 ``` C# 代码 → 创建 Runspace → 构建 Pipeline → 通过 AddScript 注入命令 → PowerShell 引擎解析执行 → 返回 PSObject 集合 → 转换为.NET对象 ``` #### 六、错误排查指南 1. **权限问题** - 需以管理员身份运行程序(操作SharePoint时常见) - 检查 `Add-PSSnapin` 是否成功加载模块 2. **执行策略限制** 在脚本开头添加: ```csharp pipeline.Commands.AddScript("Set-ExecutionPolicy Bypass -Scope Process -Force"); ``` 3. **超时处理** 配置管道超时时间: ```csharp pipeline.InvokeAsync(); // 异步执行 if (!pipeline.Output.WaitHandle.WaitOne(5000)) // 5秒超时 { pipeline.Stop(); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值