`PowerShell.Create()`返回null

时间:2018-08-07 18:44:36

标签: c# powershell .net-core .net-standard

添加的参考:PowerShellStandard.Library

默认.net-core项目中的Repro:

// ...

using System.Management.Automation;
using System.Collections.ObjectModel;

// ...

public static void Main(string[] args)
{
    Collection<PSObject> output;
    using (PowerShell ps = PowerShell.Create())
    {
        ps.AddScript("$test = Get-Date; $test");
        output = ps.Invoke();
    }

// ...

无论是否使用using块,我都尝试过,但是最终得到的结果是相同的:Create方法不是 not 创建一个{{1} }对象,但它也不引发异常

这是PowerShell PowerShell库的常见问题吗?是否有解决方法或其他方法来解决我的问题?

其他信息,在我自己探索一种管理运行空间的方法时,.net-standardRunspaceFactory方法也是如此。

3 个答案:

答案 0 :(得分:2)

浏览PowerShellStandard库的源代码时,我注意到以下几行:

public static System.Management.Automation.PowerShell Create ( System.Management.Automation.Runspaces.InitialSessionState initialSessionState ) { return default(System.Management.Automation.PowerShell); }
public static System.Management.Automation.PowerShell Create (  ) { return default(System.Management.Automation.PowerShell); }
public static System.Management.Automation.PowerShell Create ( System.Management.Automation.RunspaceMode runspace ) { return default(System.Management.Automation.PowerShell); }

那些将始终返回密封的PowerShell类的default,并且始终将是null

这使得PowerShellStandard Library 5.1不(完全)支持PowerShell。

RunspaceFactory.CreateRunspace相同。

答案 1 :(得分:2)

PowerShellStandard是一个参考库,适用于将与PowerShell加载到同一AppDomain中的项目。在这些情况下,所需的程序集已经加载完毕,因此拉下整个SDK会很浪费。

为了托管PowerShell(或从PowerShell会话外部使用PowerShell API),您需要引用PowerShell SDK(对于PowerShell Core)或GAC程序集(对于Windows PowerShell)。

要引用SDK,您需要在项目基本目录中的nuget.config文件中添加PowerShell myget作为源。这是一个例子

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <clear />
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    <add key="dotnet-core" value="https://www.myget.org/F/dotnet-core/api/v3/index.json" />
    <add key="powershell-core" value="https://powershell.myget.org/F/powershell-core/api/v3/index.json" />
  </packageSources>
</configuration>

并在csproj中添加对SDK的引用

<ItemGroup>
    <PackageReference Include="Microsoft.PowerShell.SDK" Version="6.0.3" />
</ItemGroup>

答案 2 :(得分:0)

这是最近发布的Microsoft.PowerShell.SDK 6.0.4

它看起来像是为PowerShell托管和相关任务而设计的。 至少像代码这样的问题在我的.NET Core应用程序中工作正常。 这个包参考就足够了。