为什么在通过c#中的启动过程运行PowerShell时不会导入powershell模块?

时间:2014-04-24 12:51:23

标签: c# windows powershell

我有一个c#应用程序,它使用以下代码来shellhell对powershell脚本的调用:

string scriptFileToExecute = "someScript.ps1;
var startInfo = new ProcessStartInfo();
startInfo.FileName = @"powershell.exe";
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = false;
startInfo.Arguments = string.Format(@"& '{0}' '{1}'", scriptFileToExecute, "argument");

var process = new Process { StartInfo = startInfo };
process.Start();

string output = process.StandardOutput.ReadToEnd();

这样可以正常运行脚本。

但是当我在剧本中包含这一行时:

Import-Module ServerManager

脚本失败:

errors occurred during script execution: Import-Module : The specified module 'Servermanager' was not loaded because no valid module file was found in any module directory.

当我在机器上的PowerShell中运行脚本时,这很好用。

在机器上执行Get-Module:Format-List会导致:

Name : Servermanager Path : C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Servermanager\ServerManager.psm1 Description : ModuleType : Script Version : 2.0.0.0 NestedModules : {Microsoft.Windows.ServerManager.PowerShell} ExportedFunctions : {Disable-ServerManagerStandardUserRemoting, Enable-ServerManagerStandardUserRemoting} ExportedCmdlets : {Get-WindowsFeature, Install-WindowsFeature, Uninstall-WindowsFeature} ExportedVariables : ExportedAliases : {Add-WindowsFeature, Remove-WindowsFeature}

并在外壳脚本中包含$env:path会导致:

C:\Windows\system32; C:\Windows;C:\Windows\System32\Wbem; C:\Windows\System32\WindowsPowerShell\v1.0\; C:\Program Files\Microsoft\Web Platform Installer\; C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\; C:\Program Files\Microsoft SQL Server\110\Tools\Binn\

$env:PSModulePath输出:

C:\Users\Administrator.PORTAL\Documents\WindowsPowerShell\Modules; C:\Program Files (x86)\WindowsPowerShell\Modules; C:\Windows\system32\WindowsPowerShell\v1.0\Modules\

这似乎意味着它应该加载模块,因为它存在于C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Servermanager\ServerManager.psm1

我还检查过,当从应用程序调用时,脚本作为同一用户使用相同版本的powershell运行,就像从PS直接运行一样。

什么可能阻止PS加载ServerManager模块?

2 个答案:

答案 0 :(得分:3)

因此事实证明它与平台目标有关。建立为AnyCPU(选中'更喜欢32位'复选框)或构建为x86,我们会看到此问题。构建为x64,问题在我安装的64位窗口上消失。

答案 1 :(得分:0)

请你尝试这样的事情:

Collection<PSObject> psResult = PowerShell.Create().AddScript(YourScriptString).Invoke()

PSObject类允许获取脚本返回的对象的任何属性值。