如何从JFrog仓库或GitHub获取JF CLI最新版本并实现增量更新?
实现JF CLI的PowerShell增量更新脚本
下面是一套完整的PowerShell脚本逻辑,能帮你自动对比本地JF CLI版本与最新版本,只在需要时下载更新:
步骤1:获取本地已安装版本
先检查系统里有没有装JF CLI,有的话提取版本号:
$localVersion = $null $jfPath = Join-Path $env:SYSTEMROOT system32 jf.exe if (Test-Path $jfPath) { # 执行jf --version,提取版本号(输出格式类似"jf version 2.45.0") $versionOutput = & $jfPath --version 2>&1 if ($versionOutput -match 'jf version (\d+\.\d+\.\d+)') { $localVersion = $matches[1] Write-Host "本地已安装版本: $localVersion" } else { Write-Warning "无法解析本地JF CLI版本,将执行全新安装" } } else { Write-Host "未检测到本地JF CLI,将执行全新安装" }
步骤2:获取最新版本号
推荐用GitHub Releases API,返回的JSON结构清晰,解析更可靠:
# 请求GitHub API获取最新版本 try { $latestRelease = Invoke-RestMethod -Uri "https://api.github.com/repos/jfrog/jfrog-cli/releases/latest" -ErrorAction Stop $latestVersion = $latestRelease.tag_name.TrimStart('v') # 标签是v2.xx.x,去掉前缀v Write-Host "最新版本: $latestVersion" } catch { Write-Error "获取最新版本失败: $_" exit 1 }
如果想用JFrog官方源的话,可以通过访问latest目录的重定向来获取版本号:
# 备选:从JFrog官方源获取最新版本 try { $latestRedirect = Invoke-WebRequest -Uri "https://releases.jfrog.io/artifactory/jfrog-cli/v2-jf/latest/" -MaximumRedirection 0 -ErrorAction SilentlyContinue # 重定向地址会包含版本号,比如https://releases.jfrog.io/artifactory/jfrog-cli/v2-jf/2.45.0/ if ($latestRedirect.Headers.Location -match 'v2-jf/(\d+\.\d+\.\d+)/') { $latestVersion = $matches[1] Write-Host "最新版本: $latestVersion" } } catch { Write-Error "获取最新版本失败: $_" exit 1 }
步骤3:版本对比与更新
对比本地版本和最新版本,只有当版本不一致时才下载:
# 版本对比逻辑(处理本地版本不存在的情况) if (-not $localVersion -or $localVersion -ne $latestVersion) { Write-Host "开始下载最新版本..." $downloadUrl = "https://releases.jfrog.io/artifactory/jfrog-cli/v2-jf/$latestVersion/jfrog-cli-windows-amd64/jf.exe" # 先下载到临时文件,避免覆盖正在使用的jf.exe $tempPath = Join-Path $env:TEMP "jf_temp.exe" try { Invoke-WebRequest -Uri $downloadUrl -OutFile $tempPath -ErrorAction Stop # 替换系统目录里的文件(需要管理员权限) if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Write-Error "需要管理员权限才能更新系统目录中的jf.exe" exit 1 } # 先关闭可能正在运行的jf进程(可选,防止文件被占用) Get-Process -Name jf -ErrorAction SilentlyContinue | Stop-Process -Force Copy-Item -Path $tempPath -Destination $jfPath -Force Write-Host "JF CLI已更新至版本 $latestVersion" } catch { Write-Error "下载或更新失败: $_" exit 1 } finally { # 清理临时文件 if (Test-Path $tempPath) { Remove-Item $tempPath -Force } } } else { Write-Host "本地JF CLI已是最新版本,无需更新" }
注意事项
- 脚本需要管理员权限才能写入
C:\Windows\System32目录,运行时右键选择"以管理员身份运行"。 - 如果本地有JF进程在运行,替换文件会失败,脚本里加了强制关闭进程的逻辑,根据你的需求可以调整。
- GitHub API有请求频率限制,如果你是在自动化环境中频繁运行,建议加个缓存逻辑(比如把最新版本号存在本地文件,几小时内不用重复请求API)。
内容的提问来源于stack exchange,提问作者d1530
相关产品推荐
相关产品推荐

