从.net启动时,Import-Module无法正常工作

时间:2015-05-13 06:11:25

标签: c# .net powershell

我试图在我的C#Web应用程序中运行powershell脚本。

当我在PowerShell中运行以下内容时,它可以正常工作。

  $scope.WFFormOperatorViewMap = [];
var getReceivers = function ()
    {
        createSingData();
        BaseService.postData(urlBase + 'GetReceivers', $scope.singData).then(function (data)
        {
            debugger;

            $scope.WFFormOperatorViewMap = data;
            console.log($scope.WFFormOperatorViewMap);
        })
    }  

但是当我使用我的网络应用程序运行它时,它会告诉我

  

术语' Get-NAVTenant -ServerInstance DynamicsHost'不被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。

这是我的c#代码:

Import-Module 'C:\\Program Files\\Microsoft Dynamics NAV\\80\\Service\\NavAdminTool.ps1'

Get-NAVTenant -ServerInstance DynamicsHost

有人能指出我正确的方向吗?

更新:

使用runspace.SessionStateProxy.PSVariable.GetValue("错误")我可以看到以下错误:

  

无法将参数绑定到参数'名称'因为它是空的。

     

无法将参数绑定到参数'路径'因为它是空的。

     

无法找到路径' HKLM:\ SOFTWARE \ Microsoft \ Microsoft Dynamics NAV \ 80 \ Service'因为它不存在。

     

由于主机程序或命令类型不支持用户交互,因此提示用户失败的命令。尝试支持用户交互的主机程序,例如Windows PowerShell控制台或Windows PowerShell ISE,并从不支持用户交互的命令类型中删除与提示相关的命令,例如Windows PowerShell工作流。

     

由于主机程序或命令类型不支持用户交互,因此提示用户失败的命令。尝试支持用户交互的主机程序,例如Windows PowerShell控制台或Windows PowerShell ISE,并从不支持用户交互的命令类型中删除与提示相关的命令,例如Windows PowerShell工作流。

     

由于主机程序或命令类型不支持用户交互,因此提示用户失败的命令。尝试支持用户交互的主机程序,例如Windows PowerShell控制台或Windows PowerShell ISE,并从不支持用户交互的命令类型中删除与提示相关的命令,例如Windows PowerShell工作流。

3 个答案:

答案 0 :(得分:1)

错误消息表明您的整个命令字符串被解释为(不存在的)cmdlet的名称。根据{{​​3}},AddCommand()方法需要cmdlet的名称,而参数应通过AddParameter()添加。

尝试更改此内容:

ps.Commands.AddCommand("Get-NAVTenant -ServerInstance DynamicsHost");

进入这个:

ps.Commands.AddCommand("Get-NAVTenant");
ps.Commands.AddParameter("-ServerInstance", "DynamicsHost");

或者这个:

ps.AddCommand("Get-NAVTenant");
ps.AddParameter("-ServerInstance", "DynamicsHost");

答案 1 :(得分:1)

我可以验证以下代码是否有效,从上面发布:以下代码将返回指定Dynamics NAV服务层的DatabaseServer名称

        InitialSessionState initial = InitialSessionState.CreateDefault();
        initial.ImportPSModule(new string[] { "C:\\Program Files\\Microsoft Dynamics NAV\\80\\Service\\NavAdminTool.ps1" });
        Runspace runspace = RunspaceFactory.CreateRunspace(initial);
        runspace.Open();
        PowerShell ps = PowerShell.Create();
        ps.Runspace = runspace;
        ps.Commands.AddCommand("Get-NAVTenant");
        ps.Commands.AddParameter("-ServerInstance", "objectupgrade");                        

        foreach (PSObject result in ps.Invoke())
        {
            Console.WriteLine(result.Properties["DatabaseServer"].Value);
        }
        Console.Read();
        Console.ReadKey();

更好,更快的方法是直接使用Microsoft.Dynamics.Nav.Management管理单元。使用此方法可以看到显着的性能提升。请参阅此处的以下代码:Why does PowerShell class not load a snapin

        var config = RunspaceConfiguration.Create();
        PSSnapInException warning;
        config.AddPSSnapIn("Microsoft.Dynamics.Nav.Management", out warning);

        using (Runspace runspace = RunspaceFactory.CreateRunspace(config))
        {
            runspace.Open();
            using (var ps = PowerShell.Create())
            {
                ps.Runspace = runspace;
                ps.AddCommand("Get-NAVTenant");
                ps.AddParameter("ServerInstance", "ObjectUpgrade");
                Collection<PSObject> results = ps.Invoke();
                foreach (PSObject obj in results)
                {
                    Console.WriteLine(obj.Properties["DatabaseServer"].Value);                            
                }
                Console.Read();
                Console.ReadKey();
            }
        }

答案 2 :(得分:0)

原来,开发人员Web服务器无法处理请求。切换到IIS作为开发人员服务器解决了问题。现在这两个例子都有效。