C#中管道和PowerShell类的区别

Sar*_*nKS 3 c# powershell runspace

我想知道在C#使用Pipeline类和PowerShell类时执行 PowerShell 脚本之间的区别。

使用管道:

Pipeline pipe = runspace.CreatePipeline();
Run Code Online (Sandbox Code Playgroud)

使用 PowerShell 类:

PowerShell ps = PowerShell.Create();
Run Code Online (Sandbox Code Playgroud)

我们可以同时使用它们在 C# 中执行 PowerShell 脚本,但是它们之间有什么区别呢?

mkl*_*nt0 6

注意:PowerShell SDK 文档非常稀少,因此以下是推测性的

  • 所述的实例PowerShell类为一个包装运行空间,其中一个PowerShell会话中运行的容器; 它的.RunSpace属性返回封闭的运行空间。

  • 您需要一个运行空间(RunSpace实例)才能创建和执行用于执行任意 PowerShell 语句的管道

  • 要创建管道,您有两个选择:

    • 如果你有一个PowerShell实例,你可以用它方便的方法,例如.AddScript(),以隐式创建一个管道。

    • 或者,使用运行空间的.CreatePipeline()方法显式地创建和管理管道。

简单地说:该类的便捷方法PowerShell允许更简单地创建和执行管道。

请注意,这两种方法都支持执行多个语句,包括命令(例如,cmdlet 调用)和表达式(例如,1 + 2)的任何组合。

以下代码段比较了两种方法(使用 PowerShell 本身),它们在功能上是等效的,据我所知:

# Create a PowerShell instance and use .AddScript() to implicitly create
# a pipeline that executes arbitrary statements.
[powershell]::Create().AddScript('Get-Date -DisplayHint Date').Invoke()

# The more verbose equivalent using the PowerShell instance's .RunSpace
# property and the RunSpace.CreatePipeline() method.
[powershell]::Create().RunSpace.CreatePipeline('Get-Date -DisplayHint Date').Invoke()
Run Code Online (Sandbox Code Playgroud)

我可能遗漏了一些微妙之处;如果是这样,请告诉我们。