我试图在我的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工作流。
答案 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作为开发人员服务器解决了问题。现在这两个例子都有效。