Chocolatey离线(offline)安装流程
创始人
2024-09-26 00:49:09
0

首先要确定你能下载什么版本的chocolatey,具体版本对照参考该网址:

Chocolatey Software Docs | Chocolatey Components Dependencies and Support Lifecycle

从这个网站可以找到安装和卸载的详细说明。

Chocolatey Software Docs | Setup / Install

详细步骤如下:

步骤 1:下载 Chocolatey 安装包

Chocolatey Software | Chocolatey 2.3.0

点击左下角的download下载你想要的副本,记住你的安装路径。

步骤2:转移文件位置

为了避免C盘爆满,将下载的 .nupkg 文件复制到离线机器上的某个目录。例如,将文件复制到 C:\offline-choco 目录。博主转移到了D:\user-unity3D\user-chocolatey。

步骤3:创建和运行安装脚本

①将你提供的脚本保存为一个.ps1文件,例如 install_choco_offline.ps1。

# Download and install Chocolatey nupkg from an OData (HTTP/HTTPS) url such as Artifactory, Nexus, ProGet (all of these are recommended for organizational use), or Chocolatey.Server (great for smaller organizations and POCs) # This is where you see the top level API - with xml to Packages - should look nearly the same as https://community.chocolatey.org/api/v2/ # If you are using Nexus, always add the trailing slash or it won't work # === EDIT HERE === $packageRepo = ''  # If the above $packageRepo repository requires authentication, add the username and password here. Otherwise these leave these as empty strings. $repoUsername = ''    # this must be empty is NOT using authentication $repoPassword = ''    # this must be empty if NOT using authentication  # Determine unzipping method # 7zip is the most compatible, but you need an internally hosted 7za.exe. # Make sure the version matches for the arguments as well. # Built-in does not work with Server Core, but if you have PowerShell 5 # it uses Expand-Archive instead of COM $unzipMethod = 'builtin' #$unzipMethod = '7zip' #$7zipUrl = 'https://chocolatey.org/7za.exe' (download this file, host internally, and update this to internal)  # === ENVIRONMENT VARIABLES YOU CAN SET === # Prior to running this script, in a PowerShell session, you can set the # following environment variables and it will affect the output  # - $env:ChocolateyEnvironmentDebug = 'true' # see output # - $env:chocolateyIgnoreProxy = 'true' # ignore proxy # - $env:chocolateyProxyLocation = '' # explicit proxy # - $env:chocolateyProxyUser = '' # explicit proxy user name (optional) # - $env:chocolateyProxyPassword = '' # explicit proxy password (optional)  # === NO NEED TO EDIT ANYTHING BELOW THIS LINE === # Ensure we can run everything Set-ExecutionPolicy Bypass -Scope Process -Force;  # If the repository requires authentication, create the Credential object if ((-not [string]::IsNullOrEmpty($repoUsername)) -and (-not [string]::IsNullOrEmpty($repoPassword))) {     $securePassword = ConvertTo-SecureString $repoPassword -AsPlainText -Force     $repoCreds = New-Object System.Management.Automation.PSCredential ($repoUsername, $securePassword) }  $searchUrl = ($packageRepo.Trim('/'), 'Packages()?$filter=(Id%20eq%20%27chocolatey%27)%20and%20IsLatestVersion') -join '/'  # Reroute TEMP to a local location New-Item $env:ALLUSERSPROFILE\choco-cache -ItemType Directory -Force $env:TEMP = "$env:ALLUSERSPROFILE\choco-cache"  $localChocolateyPackageFilePath = Join-Path $env:TEMP 'chocolatey.nupkg' $ChocoInstallPath = "$($env:SystemDrive)\ProgramData\Chocolatey\bin" $env:ChocolateyInstall = "$($env:SystemDrive)\ProgramData\Chocolatey" $env:Path += ";$ChocoInstallPath" $DebugPreference = 'Continue';  # PowerShell v2/3 caches the output stream. Then it throws errors due # to the FileStream not being what is expected. Fixes "The OS handle's # position is not what FileStream expected. Do not use a handle # simultaneously in one FileStream and in Win32 code or another # FileStream." function Fix-PowerShellOutputRedirectionBug {   $poshMajorVerion = $PSVersionTable.PSVersion.Major    if ($poshMajorVerion -lt 4) {     try{       # http://www.leeholmes.com/blog/2008/07/30/workaround-the-os-handles-position-is-not-what-filestream-expected/ plus comments       $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)       [void] $consoleHost.GetType().GetProperty("IsStandardErrorRedirected", $bindingFlags).GetValue($consoleHost, @())       $field2 = $consoleHost.GetType().GetField("standardErrorWriter", $bindingFlags)       $field2.SetValue($consoleHost, [Console]::Error)     } catch {       Write-Output 'Unable to apply redirection fix.'     }   } }  Fix-PowerShellOutputRedirectionBug  # Attempt to set highest encryption available for SecurityProtocol. # PowerShell will not set this by default (until maybe .NET 4.6.x). This # will typically produce a message for PowerShell v2 (just an info # message though) try {   # Set TLS 1.2 (3072), then TLS 1.1 (768), then TLS 1.0 (192), finally SSL 3.0 (48)   # Use integers because the enumeration values for TLS 1.2 and TLS 1.1 won't   # exist in .NET 4.0, even though they are addressable if .NET 4.5+ is   # installed (.NET 4.5 is an in-place upgrade).   [System.Net.ServicePointManager]::SecurityProtocol = 3072 -bor 768 -bor 192 -bor 48 } catch {   Write-Output 'Unable to set PowerShell to use TLS 1.2 and TLS 1.1 due to old .NET Framework installed. If you see underlying connection closed or trust errors, you may need to upgrade to .NET Framework 4.5+ and PowerShell v3+.' }  function Get-Downloader { param (   [string]$url  )   $downloader = new-object System.Net.WebClient    $defaultCreds = [System.Net.CredentialCache]::DefaultCredentials   if (Test-Path -Path variable:repoCreds) {     Write-Debug "Using provided repository authentication credentials."     $downloader.Credentials = $repoCreds   } elseif ($defaultCreds -ne $null) {     Write-Debug "Using default repository authentication credentials."     $downloader.Credentials = $defaultCreds   }    $ignoreProxy = $env:chocolateyIgnoreProxy   if ($ignoreProxy -ne $null -and $ignoreProxy -eq 'true') {     Write-Debug 'Explicitly bypassing proxy due to user environment variable.'     $downloader.Proxy = [System.Net.GlobalProxySelection]::GetEmptyWebProxy()   } else {     # check if a proxy is required     $explicitProxy = $env:chocolateyProxyLocation     $explicitProxyUser = $env:chocolateyProxyUser     $explicitProxyPassword = $env:chocolateyProxyPassword     if ($explicitProxy -ne $null -and $explicitProxy -ne '') {       # explicit proxy       $proxy = New-Object System.Net.WebProxy($explicitProxy, $true)       if ($explicitProxyPassword -ne $null -and $explicitProxyPassword -ne '') {         $passwd = ConvertTo-SecureString $explicitProxyPassword -AsPlainText -Force         $proxy.Credentials = New-Object System.Management.Automation.PSCredential ($explicitProxyUser, $passwd)       }        Write-Debug "Using explicit proxy server '$explicitProxy'."       $downloader.Proxy = $proxy      } elseif (!$downloader.Proxy.IsBypassed($url)) {       # system proxy (pass through)       $creds = $defaultCreds       if ($creds -eq $null) {         Write-Debug 'Default credentials were null. Attempting backup method'         $cred = get-credential         $creds = $cred.GetNetworkCredential();       }        $proxyaddress = $downloader.Proxy.GetProxy($url).Authority       Write-Debug "Using system proxy server '$proxyaddress'."       $proxy = New-Object System.Net.WebProxy($proxyaddress)       $proxy.Credentials = $creds       $downloader.Proxy = $proxy     }   }    return $downloader }  function Download-File { param (   [string]$url,   [string]$file  )   $downloader = Get-Downloader $url   $downloader.DownloadFile($url, $file) }  function Download-Package { param (   [string]$packageODataSearchUrl,   [string]$file  )   $downloader = Get-Downloader $packageODataSearchUrl    Write-Output "Querying latest package from $packageODataSearchUrl"   [xml]$pkg = $downloader.DownloadString($packageODataSearchUrl)   $packageDownloadUrl = $pkg.feed.entry.content.src    Write-Output "Downloading $packageDownloadUrl to $file"   $downloader.DownloadFile($packageDownloadUrl, $file) }  function Install-ChocolateyFromPackage { param (   [string]$chocolateyPackageFilePath = '' )    if ($chocolateyPackageFilePath -eq $null -or $chocolateyPackageFilePath -eq '') {     throw "You must specify a local package to run the local install."   }    if (!(Test-Path($chocolateyPackageFilePath))) {     throw "No file exists at $chocolateyPackageFilePath"   }    $chocTempDir = Join-Path $env:TEMP "chocolatey"   $tempDir = Join-Path $chocTempDir "chocInstall"   if (![System.IO.Directory]::Exists($tempDir)) {[System.IO.Directory]::CreateDirectory($tempDir)}   $file = Join-Path $tempDir "chocolatey.zip"   Copy-Item $chocolateyPackageFilePath $file -Force    # unzip the package   Write-Output "Extracting $file to $tempDir..."   if ($unzipMethod -eq '7zip') {     $7zaExe = Join-Path $tempDir '7za.exe'     if (-Not (Test-Path ($7zaExe))) {       Write-Output 'Downloading 7-Zip commandline tool prior to extraction.'       # download 7zip       Download-File $7zipUrl "$7zaExe"     }      $params = "x -o`"$tempDir`" -bd -y `"$file`""     # use more robust Process as compared to Start-Process -Wait (which doesn't     # wait for the process to finish in PowerShell v3)     $process = New-Object System.Diagnostics.Process     $process.StartInfo = New-Object System.Diagnostics.ProcessStartInfo($7zaExe, $params)     $process.StartInfo.RedirectStandardOutput = $true     $process.StartInfo.UseShellExecute = $false     $process.StartInfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden     $process.Start() | Out-Null     $process.BeginOutputReadLine()     $process.WaitForExit()     $exitCode = $process.ExitCode     $process.Dispose()      $errorMessage = "Unable to unzip package using 7zip. Perhaps try setting `$env:chocolateyUseWindowsCompression = 'true' and call install again. Error:"     switch ($exitCode) {       0 { break }       1 { throw "$errorMessage Some files could not be extracted" }       2 { throw "$errorMessage 7-Zip encountered a fatal error while extracting the files" }       7 { throw "$errorMessage 7-Zip command line error" }       8 { throw "$errorMessage 7-Zip out of memory" }       255 { throw "$errorMessage Extraction cancelled by the user" }       default { throw "$errorMessage 7-Zip signalled an unknown error (code $exitCode)" }     }   } else {     if ($PSVersionTable.PSVersion.Major -lt 5) {       try {         $shellApplication = new-object -com shell.application         $zipPackage = $shellApplication.NameSpace($file)         $destinationFolder = $shellApplication.NameSpace($tempDir)         $destinationFolder.CopyHere($zipPackage.Items(),0x10)       } catch {         throw "Unable to unzip package using built-in compression. Set `$env:chocolateyUseWindowsCompression = 'false' and call install again to use 7zip to unzip. Error: `n $_"       }     } else {       Expand-Archive -Path "$file" -DestinationPath "$tempDir" -Force     }   }    # Call Chocolatey install   Write-Output 'Installing chocolatey on this machine'   $toolsFolder = Join-Path $tempDir "tools"   $chocInstallPS1 = Join-Path $toolsFolder "chocolateyInstall.ps1"    & $chocInstallPS1    Write-Output 'Ensuring chocolatey commands are on the path'   $chocInstallVariableName = 'ChocolateyInstall'   $chocoPath = [Environment]::GetEnvironmentVariable($chocInstallVariableName)   if ($chocoPath -eq $null -or $chocoPath -eq '') {     $chocoPath = 'C:\ProgramData\Chocolatey'   }    $chocoExePath = Join-Path $chocoPath 'bin'    if ($($env:Path).ToLower().Contains($($chocoExePath).ToLower()) -eq $false) {     $env:Path = [Environment]::GetEnvironmentVariable('Path',[System.EnvironmentVariableTarget]::Machine);   }    Write-Output 'Ensuring chocolatey.nupkg is in the lib folder'   $chocoPkgDir = Join-Path $chocoPath 'lib\chocolatey'   $nupkg = Join-Path $chocoPkgDir 'chocolatey.nupkg'   if (!(Test-Path $nupkg)) {     Write-Output 'Copying chocolatey.nupkg is in the lib folder'     if (![System.IO.Directory]::Exists($chocoPkgDir)) { [System.IO.Directory]::CreateDirectory($chocoPkgDir); }     Copy-Item "$file" "$nupkg" -Force -ErrorAction SilentlyContinue   } }  # Idempotence - do not install Chocolatey if it is already installed if (!(Test-Path $ChocoInstallPath)) {   # download the package to the local path   if (!(Test-Path $localChocolateyPackageFilePath)) {     Download-Package $searchUrl $localChocolateyPackageFilePath   }    # Install Chocolatey   Install-ChocolateyFromPackage $localChocolateyPackageFilePath }
  • 修改$localChocolateyPackageFilePath = ‘你的安装路径’,这个在46行。例如我修改成:$localChocolateyPackageFilePath = ‘D:\user-unity3D\user-chocolatey\chocolatey.2.3.0.nupkg’
  • 注释掉:Download-Package $searchUrl $localChocolateyPackageFilePath。这个在277行。

②打开离线机器上的powershell(以管理员身份运行)

按Windows键快捷输入powershell,右键管理员运行。执行:iex "你的ps1文件保存路径\install_choco_offline.ps1"

iex "D:\user-unity3D\user-chocolatey\install_choco_offline.ps1"

大概5-10s后出现如下图所示内容,则安装完毕:

这样就安装完毕啦!

可以通过如下命令检查是否安装成功:

choco -v 

输出版本号:

也可以通过如下命令输出安装路径:

[System.Environment]::GetEnvironmentVariable('ChocolateyInstall', [System.EnvironmentVariableTarget]::Machine)

输出路径则成功:

可能出现的问题:

尽管你已经以管理员身份运行PowerShell,执行策略仍然可能阻止脚本的运行。

临时设置执行策略

  • 在管理员模式下的PowerShell窗口中,输入以下命令来临时绕过执行策略,然后再执行上面的iex命令:
  • Set-ExecutionPolicy Bypass -Scope Process -Force 

相关内容

热门资讯

笔记本xp系统安装安卓系统,轻... 你有没有想过,在你的老式笔记本上安装一个全新的操作系统呢?想象那台陪伴你多年的老笔记本,突然焕发出青...
安卓操作系统吃内存,安卓操作系... 手机里的安卓操作系统是不是让你感觉内存越来越不够用了?别急,今天就来给你好好分析分析这个让人头疼的问...
王者号ios系统怎么转安卓系统... 你是不是也和我一样,对王者荣耀这款游戏爱得深沉呢?尤其是当你发现某个英雄在安卓系统上玩起来更加得心应...
战神遗迹安卓苹果系统,探索神秘... 亲爱的玩家们,你是否曾在游戏中追寻那些传说中的神秘遗迹?今天,我要带你走进一个充满传奇色彩的领域——...
几何a安卓系统升级,畅享智能出... 你有没有发现,你的几何A最近变得聪明多了?没错,就是那个陪伴你上下班的几何A,它悄悄地升级了安卓系统...
系统最清爽的安卓手机,探索系统... 你有没有想过,拥有一部系统最清爽的安卓手机,就像是拥有了夏日里的一阵清风,让人心情舒畅,操作顺畅?今...
安卓10系统严重有问题,揭秘严... 最近你的安卓手机是不是也遇到了一些让人头疼的问题呢?别急,让我来给你一探究竟,看看安卓10系统到底有...
安卓系统闽政通打不开,“闽政通... 最近是不是有不少小伙伴在使用安卓手机时遇到了一个让人头疼的问题——闽政通打不开?别急,今天就来给你详...
安卓系统有指纹忘了图案,解锁攻... 手机解锁方式千千万,指纹解锁和图案解锁可谓是其中的佼佼者。但有时候,指纹解锁用得太多,导致忘记了图案...
QQ飞车安卓系统怎么换苹果系统... 你是不是也和我一样,对QQ飞车这款游戏爱得深沉呢?不过,最近我发现了一个超级有趣的问题:怎么把QQ飞...
安卓可冻结的系统文件,那些不可... 你知道吗?在安卓的世界里,有一些神秘的文件,它们就像隐藏在深宫中的宝贝,让人既好奇又敬畏。这些文件,...
安卓系统安装需要备份吗,关键指... 你最近是不是在准备给安卓手机升级系统或者安装新应用呢?别急,别急,在这之前,有个小细节你得注意一下—...
高仿ios的安卓系统,带你领略... 你有没有想过,为什么安卓手机那么受欢迎,却还是有人对iOS系统念念不忘呢?其实,现在市面上就有一种神...
安卓系统全能播放器,尽享视听盛... 你有没有发现,手机里总是装满了各种音乐、电影、电视剧,但是找到一个能让你一次性搞定所有播放需求的软件...
在哪里安装安卓系统好,安卓系统... 你有没有想过,为什么安卓系统这么受欢迎呢?它那强大的兼容性和丰富的应用生态,简直让人爱不释手。但是,...
如何自己提升安卓系统,自我提升... 你有没有发现,随着智能手机的普及,安卓系统已经成为了我们生活中不可或缺的一部分呢?但是,你是否想过,...
安卓子系统内存不足,应对策略与... 手机突然卡顿,是不是安卓子系统内存不足在作怪?别急,让我带你一探究竟,揭开这个问题的神秘面纱!一、安...
一鸣安卓系统如何安装,轻松上手... 你有没有想过,给你的安卓手机换换口味?别看它现在运行得风生水起,偶尔来点新鲜玩意儿,岂不是更带劲?今...
安卓操作系统的归属,源自谷歌的... 你有没有想过,那个陪伴你每天刷抖音、玩游戏、处理工作的安卓操作系统,它究竟是谁的孩子呢?今天,就让我...
安卓启动系统设置界面,揭秘安卓... 你有没有发现,每次打开安卓手机,那启动系统设置界面就像是个神秘的宝箱,里面藏着无数的小秘密?今天,就...