【问题标题】:Why does Chocolatey hang when using Powershell ISE without the `-y` switch?为什么在没有 -y 开关的情况下使用 Powershell ISE 时 Chocolatey 会挂起?
【发布时间】:2018-01-05 20:28:22
【问题描述】:

在使用带有 Chocolatey 的 PowerShell ISE 安装应用程序时,如果我忘记了 -y 开关,它会挂起等待某种“确认”,而该“确认”不会在任何地方弹出?

我必须按 Ctrl+Alt+Del 才能杀死 PowerShell ISE 和 Chocolatey,这会使事情处于中途状态。

如下所示:

【问题讨论】:

  • 不知道,但我不建议将 ISE 用作您的日常 PowerShell 控制台,因为可能会出现此类问题。
  • 是否曾经创建过包的文件夹?此外,如果您使用 -noprofile 启动 ISE,它是否有效?开始 > 运行 > powershell_ISE -NoProfile C:\ProgramData\chocolatey\logs 中是否有与您尝试安装的软件包相关的任何信息?另外,由于某种原因,没有 -y 开关会破坏交易吗?
  • PowerShell ISE 不支持交互式控制台应用程序。没有问题,因为它之后没有新行。因此 PowerShell 不会将其视为完整行,不会为其创建 string 对象,也不会在控制台上呈现不存在的 string。也没有办法提供交互式输入。
  • 啊,Chocolatey 听起来像是一个 PowerShell/控制台应用程序混合体。因此,它调用了一些需要输入的控制台可执行文件,尽管 Chocolatey 自称是 PowerShell 驱动的应用程序。有趣,但我想我现在明白为什么了。

标签: powershell powershell-ise chocolatey


【解决方案1】:

除了上述 OP 的 cmets,关于 PowerShell ISE 不支持(大多数)交互式控制台应用程序...

值得记住的是,PowerShell_ISE.exe 中的 REPL 窗口不仅仅是某种停靠的 PowerShell.exe 控制台。大多数时候用户体验相同的,但这隐藏了一些差异:

这两个可执行文件都是运行 PowerShell runspace(引擎)的主机应用程序。您甚至可以编写自己的“托管”PowerShell 的应用程序。决定用户体验的是宿主应用程序。

最后,对于最好奇的人:


我想我写这个答案更多是为了我自己的利益;同事们时不时地问我这个问题,这对我来说是一个有用的复习……

【讨论】:

  • 关于差异需要注意的一点是,这篇文章来自2009(9 年前),所以我确信已经发生了很大变化。我立即看到的一件事是 Start-Transcript 在 ISE 上不起作用,但确实如此。
  • 是的,有博客说目标是实现两个应用程序之间的平等……但也有其他人说重点已从 ISE 转移到 VSCode。
  • @CharlieJoynt 我阅读了 How PowerShell Works 文章,非常有趣,感谢分享
  • @CharlieJoynt - VS 代码绝对是未来,我(和其他人)的问题是 VSCode 在 Windows Server 实例上不是标准的。而且我经常在客户的服务器上工作,他们不喜欢我安装东西。
【解决方案2】:

这仅仅是因为 PoSH ISE 不是用于用户交互式 .exe 命令的东西。

如果您是 .exe 或任何期望响应的文件,则在 ISE 中时您必须提供它。

您可以通过尝试任何其他可以排除交互式内容的 .exe 来轻松证明这不是巧克力。例如,只需输入:

脚本窗格中的nslookup和F8运行它,或在控制台窗格中键入它并按Enter

无论哪种方式,控制台都会挂起,等待您无法提供的交互式响应。

您仍然可以在 PoSH ISE 中使用交互式命令,例如 nslookup,但您必须提供所有参数。例如:

nslookup microsoft.com
nslookup -type=mx microsoft.com
nslookup -q=soa microsoft.com

PS 5.1 现在甚至会弹出错误消息。

nslookup

无法启动“nslookup”。不支持交互式控制台应用程序。 要运行应用程序,请使用 Start-Process cmdlet 或使用“文件”菜单中的“启动 PowerShell.exe”。

要查看/修改被阻止的控制台应用程序列表,请使用 $psUnsupportedConsoleApplications,或查阅在线帮助。 在 line:0 char:0

您可以通过这种方式轻松地临时访问 PowerShell 控制台主机。 这是我的个人资料中的一项功能。

Function Start-ConsoleCommand
{
    [CmdletBinding()]

    [Alias('scc')]

    Param  
    ( 
        [string]$ConsoleCommand,
        [switch]$PoSHCore
    )

    If ($PoSHCore)
    {Start-Process pwsh -ArgumentList "-NoExit","-Command  &{ $ConsoleCommand }" -Wait}
    Else
    {Start-Process powershell -ArgumentList "-NoExit","-Command  &{ $ConsoleCommand }" -Wait}

}

所以,只需输入

scc -ConsoleCommand choco install winmerge

它将弹出控制台主机并保持打开状态,直到您关闭它。

更新 根据 - Alex Kwitny 的要求

PoSHGet 默认只有两个仓库,

nuget
PSGallery

但您可以添加自己的或其他的。 您可以使用以下 cmdlet 来实现这一点。 我已经有一段时间不用 Chocolatey 了,但是快速浏览一下我的档案,以下是我用过的

设置巧克力存储库

Find-Module
Get-Module
Find-Package
Get-Package

Get-PackageProvider
Get-PackageSource
Get-PackageSource -Provider chocolatey
Register-PackageSource -Name chocolatey -Provider Chocolatey -Trusted -Location http://chocolatey.org/api/v2/ -Verbose 

Find-Module
Get-Module
Find-Package
Get-Package

【讨论】:

  • 我刚刚开始使用 Chocolatey,但它似乎被宣传为对 PowerShell 非常友好。我只是假设它是为了适应我正在做的事情而建造的。
  • 是的,但只有在不支持 PowerShellGet 的 PoSH 版本上才需要它。这是默认情况下 PoSH v5 的一部分 technet.microsoft.com/en-us/library/dn835097.aspx,但您可以将其添加到 PoSH v3-4。 PowerShellGet 是用于 PowerShell 包管理的 nuget 实现。 PowerShell 4 和 3 的包管理预览版现已推出...blogs.msdn.microsoft.com/powershell/2015/10/09/…。如果需要,注意会阻止您同时使用两者。我两个都用。
  • 我不知道!那么对于PowerShellGet,它是否适用于相同的巧克力包装,​​或者在某个地方是否有另一个主要的仓库?当我在电脑前时,我会花一些时间在谷歌上搜索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
相关资源
最近更新 更多