Powershell命令在dotNet 3.1.401

时间:2020-09-12 18:14:28

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

我正在尝试从通过powershell SDK创建的实例执行powershell命令,但是显然不是所有命令都可以执行,这可能是我的错误,但是只有一些命令返回了一个值,如文档所述,这是我的代码:

  class ShellModel
{      
    private Runspace runspace;       
    private PowerShell invoker;

   public ShellModel()
    {               
        
        
    }

    public void executeCmd(string cmd)
    {

        using (runspace = RunspaceFactory.CreateRunspace())
        { 
            runspace.Open();                
            using (invoker = PowerShell.Create()) 
            {
                invoker.Runspace = runspace;
                invoker.Commands.AddScript("Get-WmiObject win32_service"/*+ " | Out-String"*/);
                var requestInvoker = invoker.Invoke("Set-ExecutionPolicy Unrestricted");
                System.Console.WriteLine(requestInvoker.Count);
                foreach (var request in requestInvoker)
                {
                    System.Console.Write("---> ");
                    System.Console.WriteLine(request);
                }                    
                
            }
            runspace.Close();
        }
        

    }

}

应该注意,我正在使用这些库,并且以相同的方式安装了Microsoft建议的netcore依赖项

using System.Management.Automation.Runspaces;
using System.Management.Automation;

包装

<PackageReference Include="Microsoft.Management.Infrastructure.CimCmdlets" Version="7.0.3" />
<PackageReference Include="Microsoft.PowerShell.SDK" Version="7.0.3" />

“错误”被包裹在其中,如果我执行某些powershell命令,我会有一个响应,例如“ Get-Host”,但是当尝试执行另一个命令,例如“ Get-WmiObject win32_service”时,我没有得到响应而且我什至不知道命令是否成功执行,并且验证当尝试通过响应对象“ requestInvoker”并使用“ count”方法时,这些发现为空,并且在执行某些命令时也会发生例如“ Get-Host”,它将返回一个对象,而我无法通过当前存在的每个循环使用它,并且只能通过将“ | Out-String”直接连接到powershell命令的情况来显示结果不需要“ Get-Command”。

我尝试了其他方法来执行命令,在相同的情况下,我无法使其执行,甚至出现异常,该命令无法识别,这对我来说没有意义,也许我在使用它们的方式上是错误的,但是在所有方面,例外都是相同的。

这是一些命令对我起作用的方式:

invoker.Commands.AddScript("Get-WmiObject win32_service"/*+ " | Out-String"*/);

这是它无法识别命令并引发异常的其他方式

//Way 1
invoker.Commands.AddCommand("Get-WmiObject").AddArgument("win32_service");
//Way 2
invoker.Commands.AddCommand("Get-WmiObject").AddParameter("win32_service"); 
//Way 3   
invoker.Commands.AddCommand("Get-WmiObject").AddParameter("-Class ").AddArgument("win32_service");

例外

System.Management.Automation.CommandNotFoundException: 'The term 'Get-WmiObject' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.'

我将不胜感激能正确执行命令的任何帮助或想法

0 个答案:

没有答案