我目前正在尝试使用c#调用可以在Powershell中使用的Get-SMBShare ...但是,它会抛出此错误:
例外:被抓:"术语' Get-SMBShare'不被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。" (System.Management.Automation.CommandNotFoundException) 捕获到System.Management.Automation.CommandNotFoundException:"术语' Get-SMBShare'不被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。" 时间:2015年10月25日19:17:59 线程:管道执行线程[6028]
我的第一语言是PowerShell,所以我试图将一个GUI工具从PowerShell转换为C#,该工具使用了数百个PS命令 - 我应该调用一些东西吗?我在这里用控制台测试东西。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
private static void GetShareNames()
{
// Call the PowerShell.Create() method to create an
// empty pipeline.
PowerShell ps = PowerShell.Create();
ps.AddCommand("Get-SmbShare");
Console.WriteLine("Name Path");
Console.WriteLine("----------------------------");
// Call the PowerShell.Invoke() method to run the
// commands of the pipeline.
foreach (PSObject result in ps.Invoke())
{
Console.WriteLine(
"{0,-24}{1}",
result.Members["Name"].Value,
result.Members["Path"].Value);
} // End foreach.
Console.ReadLine();
} // End Main.
static void Main(string[] args)
{
GetShareNames();
}
}
}
答案 0 :(得分:3)
您需要先导入模块。在尝试执行Get-SmbShare
命令之前,请坚持使用此行:
ps.AddCommand("Import-Module").AddArgument("SmbShare");
ps.Invoke();
ps.Commands.Clear();
ps.AddCommand("Get-SmbShare");
另一种方法是使用预先加载的SmbShare模块初始化运行空间,例如:
InitialSessionState initial = InitialSessionState.CreateDefault();
initial.ImportPSModule(new[] {"SmbShare"} );
Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;