如何调用PowerShell命令与"格式列表"和"从文件"从C#管道? [英] how to invoke the powershell command with "format-list" and "out-file" pipeline from c#?

查看:342
本文介绍了如何调用PowerShell命令与"格式列表"和"从文件"从C#管道?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨我工作的一个C#程序调用的Exchange 2010 PowerShell命令远程运行空间。 ps命令是:

Hi I'm working on a C# program to call exchange 2010 powershell cmdlets in remote runspace. The ps command is:

GET-MailboxDatabase -Server EX2010SVR1 -Status |格式列表
身份,GUID安装, CircularLoggingEnabled,恢复|出文件
'C:\db.txt。-Encoding UTF8 -Width 8192

"Get-MailboxDatabase -Server EX2010SVR1 -Status | Format-List Identity,Guid,mounted,CircularLoggingEnabled,Recovery | Out-File 'C:\db.txt' -Encoding UTF8 -Width 8192".

我的代码是类似于:


static int Main(string[] args)
{

    const string SHELL_URI = "http://schemas.microsoft.com/powershell/Microsoft.Exchange";
    const string COMMAND = "Get-MailboxDatabase -Server EX2010SVR1 -Status | Format-List Identity,Guid,mounted,CircularLoggingEnabled,Recovery | Out-File 'C:\db.txt' -Encoding UTF8 -Width 8192";

    System.Uri serverUri = new Uri("http://EX2010SVR1/powershell?serializationLevel=Full");
    PSCredential creds = (PSCredential)null; // Use Windows Authentication
    WSManConnectionInfo connectionInfo = new WSManConnectionInfo(serverUri, SHELL_URI, creds);

    try
    {
        using (Runspace rs = RunspaceFactory.CreateRunspace(connectionInfo))
        {
            rs.Open();
            PowerShell psh = PowerShell.Create();
            psh.Runspace = rs;
            psh.AddCommand(COMMAND);
            Collection results = psh.Invoke();
            rs.Close();
        }
    }
    catch (Exception ex)
    {
        System.Console.WriteLine("exception: {0}", ex.ToString());
    }
    return 0;
}

当我运行的Win2008 R2的C#程序,托管Exchange 2010服务器,我总是得到异常:

When I run the c# program on Win2008 R2 which is hosting exchange 2010 server, I always get exception:


    System.Management.Automation.RemoteException: The term 'Format-List' 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.
    at System.Management.Automation.PowerShell.CoreInvoke[TOutput](IEnumerable input, PSDataCollection`1 output, PSInvocationSettings settings)
    at System.Management.Automation.PowerShell.Invoke(IEnumerable input, PSInvocationSettings settings)
    at System.Management.Automation.PowerShell.Invoke()
    at RemotePS.Program.Main(String[] args)

该计划是没有格式列表和OUT-文件管道工作的罚款。整个命令也在Exchange 2010管理外壳做工精细。我也证实了它的PowerShell的2.0系统。

The program is working fine without "Format-List" and "Out-File" pipelines. The entire command is also working fine in exchange 2010 management shell. I also confirmed it's powershell 2.0 on the system.

可以在任何一个可以帮助弄清楚这是怎么回事?任何帮助深表感谢。

Could any one help to figure out what's going on? Any help is much appreciated.

汤姆

推荐答案

我已经得到了与第一嵌入式PowerShell的我写了同样的问题。我找了痕迹,但我无法找到它了。

I've got the same problem with the first embeded PowerShell I wrote. I look for a trace, but I can't find it anymore.

下面的东西为我工作,我适应您的代码:

Here is something working for me that I adapt to your code :

static void Main(string[] args)
{
  const string SHELL_URI = "http://schemas.microsoft.com/powershell/Microsoft.PowerShell";
  const string COMMAND = @"get-process | format-List | Out-File -file c:\temp\jpb.txt";
  System.Uri serverUri = new Uri("http://WM2008R2ENT/powershell?serializationLevel=Full");
  PSCredential creds = (PSCredential)null; // Use Windows Authentication
  WSManConnectionInfo connectionInfo = new WSManConnectionInfo(false,
                                                               "WM2008R2ENT",
                                                               5985,
                                                               "/wsman",
                                                               SHELL_URI,
                                                               creds);
  try
  {
    using (Runspace rs = RunspaceFactory.CreateRunspace(connectionInfo))
    {
      rs.Open();

      Pipeline pipeline = rs.CreatePipeline();

      string cmdLine;
      cmdLine = string.Format("&{{{0}}}", COMMAND);

      pipeline.Commands.AddScript(cmdLine);

      Collection<PSObject> results = pipeline.Invoke();

      rs.Close();
    }
  }
  catch (Exception ex)
  {
    System.Console.WriteLine("exception: {0}", ex.ToString());
  }
  return; 
}



要当心,我'不使用Exchange PowerShell中

Be carefull, I'am not using Exchange PowerShell

在我使用管道的例子,也许你的问题来自于您通过命令的方式。

In the example I use pipeline, perhaps your problem comes from the way you pass the command.

这篇关于如何调用PowerShell命令与&QUOT;格式列表&QUOT;和&QUOT;从文件&QUOT;从C#管道?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆