gpt4 book ai didi

windows - 为什么在使用 Vagrant 配置 Windows 7 VM 时 Chocolatey 无法安装?

转载 作者:可可西里 更新时间:2023-11-01 09:33:13 25 4
gpt4 key购买 nike

我正在尝试使用 Packer (v.0.8.6) 自动创建 Windows 7 开发环境, Vagrant (v.1.8.1) , VirtualBox (v.5.0.10) , 和 Chocolatey (v.0.9.9.11)在 Windows 8.1 主机上。

我已经成功地使用 Packer 创建了基本的 Windows 7 SP1 框,并且我正在尝试使用 vagrant up 创建带有 Vagrant 的虚拟机。我要做的第一件事是安装 Chocolatey,这样我就可以轻松配置其他软件。

但是。我这样做没有成功。我在我的 Vagrantfile 中尝试了各种咒语。这是内容。

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "windows_7"
config.vm.provider "virtualbox" do |vb|
# Display the VirtualBox GUI when booting the machine
vb.gui = true
end

# option 1
# config.vm.provision "shell", "inline": "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))"

# option 2
# config.vm.provision "shell", "path": "./scripts/install-chocolatey.cmd"

# option 3
# config.vm.provision "shell", path: "./scripts/install-chocolatey.ps1"
end

# ./scripts/install-chocolatey.cmd
@powershell -NoProfile -ExecutionPolicy Bypass -File "%systemdrive%\vagrant\scripts\install-chocolatey.ps1"

# ./scripts/install-chocolatey.ps1
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))

我收到的任何这些选项的错误是:

==> default: Everything is Ok
==> default:
==> default: Files: 76
==> default: Size: 4893948
==> default: Compressed: 1806765
==> default: out-lineoutput : The OS handle's position is not what FileStream expected. Do n
==> default: ot use a handle simultaneously in one FileStream and in Win32 code or another F
==> default: ileStream. This may cause data loss.
==> default: + CategoryInfo : NotSpecified: (:) [out-lineoutput], IOException
==> default: + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Comma
==> default: nds.OutLineOutputCommand
==> default:

但是,如果我从虚拟机上的 Cmd 或 PowerShell 窗口手动运行选项 1、2 或 3,chocolatey 可以正常安装。

我在网上搜索了这个错误,它似乎是一个 PowerShell 2 and 3 bug .事实上,如果我在虚拟机上手动安装 PowerShell 4 并运行 vagrant provision 来重新配置它,这些选项就可以工作。

但如果是这样的话,为什么我可以手动安装 chocolatey 而不是通过 Vagrant?我想使用 chocolately 来升级 PowerShell,因为以自动化方式执行此操作会容易得多。

如何在不先将 PowerShell 升级到更新版本的情况下指示 Vagrant 在我的虚拟机上安装 Chocolatey?


解决方法尝试 1:

我尝试将 VirtualBox 从 5.0.10 降级到 4.3.28 以查看是否存在问题(根据建议)。但是,我无法在我的主机上运行 4.3.28,因为我在尝试创建新虚拟机时收到错误消息,即使开箱即用,也没有打包程序或 Vagrant 。重新安装 5.0.10 解决了该特定问题。


解决方法尝试 2:

我应用了 Powershell 2 变通脚本 defined here到我的 install-chocolatey.ps1 脚本。完整的内容变成了:

$bindingFlags = [Reflection.BindingFlags] "Instance,NonPublic,GetField"
$objectRef = $host.GetType().GetField("externalHostRef", $bindingFlags).GetValue($host)

$bindingFlags = [Reflection.BindingFlags] "Instance,NonPublic,GetProperty"
$consoleHost = $objectRef.GetType().GetProperty("Value", $bindingFlags).GetValue($objectRef, @())

[void] $consoleHost.GetType().GetProperty("IsStandardOutputRedirected", $bindingFlags).GetValue($consoleHost, @())
$bindingFlags = [Reflection.BindingFlags] "Instance,NonPublic,GetField"
$field = $consoleHost.GetType().GetField("standardOutputWriter", $bindingFlags)
$field.SetValue($consoleHost, [Console]::Out)
$field2 = $consoleHost.GetType().GetField("standardErrorWriter", $bindingFlags)
$field2.SetValue($consoleHost, [Console]::Out)

iex -Debug ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))

这允许 Chocolatey 安装。但是,在我重新启动机器之前,我无法从 Vagrant provisioner 或 cmd 行或 PowerShell 窗口发出 choco 语句。然而,一旦重新启动,这些就可用了,这会导致配置失败。据我了解,我不需要重新启动机器即可使用 Chocolatey。我应该只需要重新启动外壳。检查 PATH 变量,我发现 Chocolatey 尚未添加到 PATH 中,这可以解释问题。

最佳答案

因此,当一个流(如 stdout)的日志后跟另一个流(如 stderr)的日志时,你会看到 PowerShell 错误消息,通常涉及将输出写入文件路径。

发生错误,但不幸的是 PowerShell 正在吞下它并重现其他问题 - 您可以在调用安装 Chocolatey 之前添加 $env:ChocolateyDebug 并查看它是否有助于指出错误位置正在发生。

如果我不得不猜测这可能与 Chocolatey 尝试安装 .NET Framework 4.0 并遇到错误有关。在我的 vagrant repo 中,我倾向于将 .Net 4 安装的步骤与 Chocolatey 分开。该 repo 协议(protocol)位于 vagrant-windows-puppet .

关于windows - 为什么在使用 Vagrant 配置 Windows 7 VM 时 Chocolatey 无法安装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34666677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com