我正在编写一个DOTNET核心2.0控制台应用程序,它将接收一个powershell命令并在该系统上执行它并返回结果(现在到控制台)。
下面的代码示例是我想要完成的内容的精简版本。使用此代码,如果我执行命令 dotnet run" get-childitem "我收到以下回复:
[x] Received get-childitem
Directory: C:\git\campus-database-services
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 4/3/2018 3:18 PM .vscode
d----- 4/17/2018 8:58 PM bin
d----- 4/17/2018 8:58 PM obj
-a---- 4/3/2018 3:18 PM 9 .gitignore
-a---- 4/3/2018 3:18 PM 211 AppSettings.json
-a---- 4/20/2018 10:29 AM 763 campus-database-services.cs
-a---- 4/17/2018 8:55 PM 1091 campus-database-services.csproj
-a---- 4/8/2018 8:17 AM 392 nuget.config
[x] Done get-childitem
但是,当我执行命令 dotnet run" Get-DbaSqlService" 时,我得到以下输出:
[x] Received Get-DbaSqlService
[x] Done Get-DbaSqlService
这是在http://dbatools.io找到的PowerShell模块 - 一个非常标准的SQL Server社区驱动的PowerShell模块。该模块在我的系统上运行良好。在我的机器上调用时,它将返回所有已安装的SQL Server服务的列表。这是调用系统上安装的Powershell模块的一个非常简单的示例。在我调用Powershell模块的情况下,我没有得到如上所示的结果 - 根本没有输出命令。我也可以调用任何Powershell模块中的任何函数。 但是,如果我调用任何本机命令,例如 get-childitem , get-process 或 get-service ,则返回结果可以正常工作。每当我从已安装的模块调用函数时,我都不会收到错误,只是没有结果。
此应用程序的目的是传入命令,它将执行它们并返回结果。在这种情况下,似乎powershell命令从未执行或返回结果。
非常感谢任何帮助。我是新手,看起来非常微不足道。但是,我很困难,已经有一段时间了。
using System;
using System.Text;
using System.Threading;
using System.Management.Automation;
using System.Net;
class MyApp
{
public static void Main(string[] message)
{
Console.WriteLine(" [x] Received {0}", message[0]);
var shell = PowerShell.Create();
shell.Commands.AddScript(message[0] + " | out-string");
var results = shell.Invoke();
if (results.Count > 0)
{
var builder = new StringBuilder();
foreach (var psObject in results)
{
builder.Append(psObject.BaseObject.ToString() + "\r\n");
}
Console.WriteLine(builder.ToString());
}
Console.WriteLine(" [x] Done {0}", message[0]);
}
}