首页 > 解决方案 > 无法通过在 C# 中调用 powershell 来安装 NuGet 提供程序

问题描述

我从下面的 C# 方法调用 powershell cmdlet,它在 Install-Module Name CosmosDb 行失败,并出现以下错误

“使用“2”参数调用“ShouldContinue”的异常:“提示用户的命令失败,因为主机程序或命令类型不支持用户交互。主机试图通过以下消息请求确认:PowerShellGet 需要 NuGet 提供程序版本“2.8.5.201”或更高版本才能与基于 NuGet 的存储库进行交互。NuGet 提供程序必须在“C:\Program Files\PackageManagement\ProviderAssemblies”或“C:\Users\UserName\AppData\Local\PackageManagement\ProviderAssemblies”中可用。您还可以通过运行“Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force”来安装 NuGet 提供程序。您希望 PowerShellGet 现在安装和导入 NuGet 提供程序吗?”

C#代码:

{            
            InitialSessionState initialSessionState = InitialSessionState.CreateDefault();
            initialSessionState.ExecutionPolicy = ExecutionPolicy.Unrestricted;
            using Runspace runspace = RunspaceFactory.CreateRunspace( initialSessionState );
            string path = Path.Combine( CosmosDataFixture.Root , @"TestData\GetrRecording.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:ProgramFiles\Azure Cosmos DB Emulator\PSModules\Microsoft.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

我在这里需要第一行和最后一行,但错误提示我在 middl 中添加这两个

标签: c#powershellnuget

解决方案


本答案中所述,当您使用 PowerShell SDK 时,您不能使用请求用户交互式输入的PowerShell 命令,因此您唯一的选择是避免此类交互式提示,这取决于特定命令,需要-Force-Confirm:$false(尽管请注意可能不支持这两个参数)。

  • Install-PackageProvider支持-Confirm,因此您应该尝试-Confirm:$false(可能与 结合使用-Force)以查看是否以编程方式确认了正常交互的提示。

  • Import-Module支持-Force,但它本身不会提示用户;而是-Force发出强制重新加载已导入模块的意图。

    • 然而,可能发生的情况(正如您的反馈所建议的那样)是正在导入的模块试图创建一个提升的(以管理员身份运行)进程,这总是使系统提出一个UAC(用户帐户控制)提示(“你是否允许此应用对您的设备进行更改?”)以确认执行此安全敏感操作的意图。

      • 按照设计,出于安全原因,无法以编程方式回答此 UAC 提示。
    • 您唯一的选择是使用提升运行程序本身,例如从通过右键单击 PowerShell 图标并选择 启动的 PowerShell 控制台运行程序Run as Administrator


至于你尝试了什么:

笔记:

  • 以下是关于以编程方式响应PowerShell提示的一般要点。如上所述,实际上并不是它本身提出提示,但在您的情况下,它是正在导入的特定模块;该提示 ( ) 是系统提出的 UAC 提示,设计上不能以编程方式回答。Import-Module"Do you want this app to make changes to your computer?"
ECHO 'Y' | Import-Module ...

总是失败,因为您根本无法使用 (PowerShell)管道输入来回答 PowerShell 的交互式提示。

  • 以编程方式响应交互式PowerShell提示的唯一方法是调用 PowerShell CLI并通过标准输入提供响应-请参阅此答案

大概你没有看到失败(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


推荐阅读