为什么在c#中通过启动进程运行powershell时,powershell模块不导入

本文关键字:powershell 模块 导入 运行 进程 启动 为什么 | 更新日期: 2023-09-27 17:59:45

我有一个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中运行脚本时,这一点很好。

在机器上执行获取模块:格式化列表结果为:

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}

并且将CCD_ 3包括在外壳脚本中导致:

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运行脚本时是否以相同版本的powershell运行。

是什么原因阻止PS加载ServerManager模块?

为什么在c#中通过启动进程运行powershell时,powershell模块不导入

因此它与平台目标有关。构建为AnyCPU(选中"首选32位"复选框)或构建为x86,我们看到了这个问题。以x64构建,在我安装的64位窗口上问题消失了。

你能试试这样的东西吗:

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

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