问题描述
我正在从Below C#方法调用Powershell cmdlet,它在Install-Module Name CosmosDb行失败,出现以下错误
使用";2";参数调用";ShouldContinue";时出现异常:";A命令 提示用户失败的原因是主机程序或命令 类型不支持用户交互。主机正在尝试 使用以下消息请求确认:PowerShellGet 需要NuGet提供程序版本‘2.8.5.201’或更高版本才能与之交互 基于Nuget的存储库。NuGet提供程序必须在中可用 ‘c:Program FilesPackageManagementProviderAssemblies’或 ‘C:UsersUserNameAppDataLocalPackageManagementProviderAssemblies’. 您还可以通过运行以下命令安装NuGet提供程序 ‘Install-PackageProvider-Name NuGet-MinimumVersion 2.8.5.201 -FORCE‘。是否希望PowerShellGet立即安装并导入NuGet提供程序?(&Q;)
C#代码:
{
InitialSessionState initialSessionState = InitialSessionState.CreateDefault();
initialSessionState.ExecutionPolicy = ExecutionPolicy.Unrestricted;
using Runspace runspace = RunspaceFactory.CreateRunspace( initialSessionState );
string path = Path.Combine( CosmosDataFixture.Root , @"TestDataGetrRecording.ps1" );
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript( path );
Collection<PSObject> results = pipeline.Invoke();
runspace.Close();
}
PS1脚本文件中的Powershell cmdlet
ECHO 'Y'|Import-Module "$env:ProgramFilesAzure Cosmos DB EmulatorPSModulesMicrosoft.Azure.CosmosDB.Emulator"
Install-Module PowershellGet -Force -Scope CurrentUser
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.208 -Force
Install-Module -Name CosmosDB -Scope CurrentUser -Force
我需要这里的第一行和最后一行,但错误提示我将这两行添加到中间
推荐答案
如this answer中所述,在使用PowerShell SDK时不能使用请求交互式输入的powershell命令,因此您唯一的选择是避免此类交互式提示,这取决于具体命令需要-Force
或-Confirm:$false
(但请注意,既不支持参数也不支持参数)。
Install-PackageProvider
支持-Confirm
,因此您应该尝试-Confirm:$false
(可能与-Force
结合使用),查看是否以编程方式确认正常交互提示。
Import-Module
支持-Force
,但本身不会提示用户;相反,-Force
会发出强制重新加载已导入模块的意图的信号。
可能发生的情况(如您的反馈所建议的)是,正在导入的模块尝试创建提升的(以管理员身份运行)进程,这总是会使系统显示UAC (User Account Control)提示(&q;是否要允许此应用对您的设备进行更改?&q;)以确认执行此安全敏感操作的意图。(&Q;)(&Q;)以确认执行此安全敏感操作的意图。系统提示UAC (User Account Control)(&Q;是否要允许此应用更改您的设备?&Q;)以确认执行此安全敏感操作的意图。<<
- 出于安全原因,根据设计,此UAC提示无法以编程方式回答。
您唯一的选择是使用提升本身来运行程序,例如从PowerShell控制台运行,该控制台通过右键单击PowerShell图标并选择
Run as Administrator
来启动。
至于您尝试的:
注意:
- 以下是关于以编程方式响应PowerShell提示的一般要点。如上所述,实际上不是
Import-Module
本身提供提示,但在您的情况下,它是要导入的特定模块;提示("Do you want this app to make changes to your computer?"
)是由系统提供的UAC提示,可以通过设计NOT进行编程回答。
ECHO 'Y' | Import-Module ...
总是失败,因为您根本无法使用(PowerShell)管道输入来回答PowerShell的交互提示。
- 以编程方式响应交互式PowerShell提示的唯一方法是调用PowerShellCLI,并通过stdin提供响应-请参见this answer。
您可能没有看到失败(Import-Module: The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.
),因为.Invoke()
返回值没有直接报告(它只包含成功输出);要检查错误(错误流),请使用pipeline.Error
这篇关于无法通过调用C#中的Powershell安装NuGet提供程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!