【问题标题】:Running a powershell script in memory在内存中运行 powershell 脚本
【发布时间】:2014-03-26 05:07:50
【问题描述】:

我正在寻找一种方法,了解如何使用系统上最新的 powershell 引擎在内存中的 C# 中运行 powershell 脚本。 目前,我使用 Microsoft Windows PowerShell Engine Core Assembly (System.Management.Automation),它非常适合使用 powershell 2.0 版引擎的 powershell 脚本。

我的目标是创建一个 .NET 2.0 或 3.5 程序集,它使用系统上最新的 powershell 引擎调用内存中的 powershell 脚本。这可能是版本 2 或 3。

这些是我的先决条件:

  • 我的程序集应该面向 .NET 2.0 或 .NET 3.5
  • 始终使用最新版本的 powershell 引擎
  • 在内存中运行脚本(将 PS 脚本临时存储在硬盘上是不行的)

有什么想法吗?

【问题讨论】:

  • 为什么需要使用最新的 PowerShell?您只是需要能够在最新的 PowerShell 上运行,还是希望针对最新版本中的新功能?
  • 机器上安装powershell v3时,脚本使用powershell 3特性。
  • 这将更加棘手,因为使用较新的 3.0 功能的 C# 代码需要针对 v3 版本的 System.Management.Automation.dll 进行编译。我会在一个引用 SMA v1/2 的类库中编译 V1/2 的东西,在另一个引用 SMA v3 的类库中编译 V3/V4 的东西。然后在运行时确定系统上使用哪个 Assembly.LoadFrom 来加载适当的类库。您还会遇到运行正确 .NET 运行时的问题。这可能需要一个小的 EXE 存根来执行此确定,然后启动两个 exe 之一(一个用于 .NET 2.0,一个用于 4.0)

标签: c# .net windows powershell powershell-3.0


【解决方案1】:

创建一个RAM disk 并将脚本文件存储在那里。或者,如果您根本不想存储任何脚本文件,则使用 AddCommand() method 将单个命令添加到 PowerShell 对象。

【讨论】:

    【解决方案2】:

    您可以将脚本作为“嵌入式资源”嵌入到 C# 程序中,然后在运行时将其提取出来。看看这个script 第 149-155 行,了解如何做到这一点。从 .NET 2.0 到 3.5 很容易,因为 2.0、3.0 和 3.5 都在 .NET 2.0 运行时上运行 - 只需针对 .NET 2.0。

    但是,如果您希望始终以最新版本的 PowerShell 引擎为目标,这将变得更加棘手,因为 PowerShell V3 和 V4 以 .NET 4.0 为目标。如果您的程序集始终以 .NET 2.0(甚至 3.5)为目标,您将无法使用最新 PowerShell 引擎中的新功能,因为您必须在编译期间引用 V3 System.Management.Automation.dll 程序集,并且它需要 .网络 4.0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多