我有一个 c# 应用程序,它使用以下代码来调用 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 : ServermanagerPath : C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Servermanager\ServerManager.psm1Description :ModuleType : ScriptVersion : 2.0.0.0NestedModules : {Microsoft.Windows.ServerManager.PowerShell}ExportedFunctions : {Disable-ServerManagerStandardUserRemoting, Enable-ServerManagerStandardUserRemoting}ExportedCmdlets : {Get-WindowsFeature, Install-WindowsFeature, Uninstall-WindowsFeature}ExportedVariables :ExportedAliases : {Add-WindowsFeature, Remove-WindowsFeature}
并在脱 shell 脚本中包含 $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
我还检查了从应用程序调用时,脚本是否以相同用户身份运行,并且从 PS 直接运行时使用相同版本的 powershell。

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

最佳答案

所以结果证明它与平台目标有关。构建为 AnyCPU(选中“首选 32 位”复选框)或构建为 x86,我们看到了这个问题。构建为 x64,问题在我正在安装的 64 位 Windows 上消失了。

关于c# - 为什么在 c# 中通过启动进程运行 powershell 时不导入 powershell 模块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23269447/

10-12 12:41