一键配置 Web 前端开发环境(PowerShell 自动化脚本)

news/2025/10/23 15:14:30/文章来源:https://www.cnblogs.com/guojikun/p/19160727

前言

💡 最近重装系统后发现重新配置前端开发环境太繁琐,于是写了个 PowerShell 自动化脚本
可以在 Windows 系统 下,一键完成常用开发工具的安装与配置,让你重装系统后快速开工!

✨ 功能简介

这个脚本支持以下功能👇:

  • ✅ 自动检测并安装 PowerShell 7+
  • ✅ 自动检测并安装 Git、VS Code、Volta
  • ✅ 自动配置环境变量(例如 VOLTA_FEATURE_PNPM
  • ✅ 使用 Volta 安装 Node.jspnpm
  • ✅ 支持交互式选择安装可选软件(Snipaste、Chrome、Firefox、QQ、微信)
  • ✅ 自动刷新环境变量,无需手动配置 PATH

📦 支持的工具列表

类别 工具 说明
基础工具 PowerShell 7+ 现代化 PowerShell 运行环境
版本管理 Volta Node.js / pnpm 管理工具
开发工具 Git、Visual Studio Code 前端开发必备
可选软件 Snipaste、Chrome、Firefox、QQ、微信 可交互选择安装

⚙️ 使用方式

1️⃣ 下载脚本

创建一个文件,例如 web-env-setup.ps1,然后将下面的脚本内容复制进去 👇

# 设置脚本在出错时停止
$ErrorActionPreference = "Stop"# 使用 Winget 判断软件是否以安装
function Installed {param ([string]$packageId)try {# 屏蔽 winget 的错误输出,使用 -SimpleMatch 避免正则,-Quiet 返回布尔$found = winget list --id $PackageId 2>$null | Select-String -SimpleMatch -Quiet $PackageIdreturn [bool]$found}catch {# 如果 winget 不存在或运行失败,返回 $false(也可以选择写日志或抛出错误)return $false}
}# 使用 winget 安装软件
function WingetInstall {param([Parameter(Mandatory = $true)][string]$PackageId,[Parameter(Mandatory = $false)][string]$DisplayName = $PackageId)$installCmd = "winget install $PackageId --accept-source-agreements --accept-package-agreements -e"Write-Log "🔧 使用 winget 安装 $DisplayName..." "Cyan"Invoke-Expression $installCmdif ($LASTEXITCODE -ne 0) { Write-Log "❌ 使用 winget 安装 $DisplayName 失败(ExitCode=$LASTEXITCODE)。" "Red" }else { Write-Log "✅ 已通过 winget 安装 $DisplayName 成功。" "Green" }
}# -------------------------
# PowerShell 版本检查与自动安装(确保运行在 PowerShell 7+)
function Restart-InPwsh7IfNeeded {$CurrentMajor = $PSVersionTable.PSVersion.Majorif ($CurrentMajor -ge 7) { return $false }Write-Host "⚠️ 当前会话为 PowerShell 小于 7,检测系统中是否已安装 PowerShell 7+..." -ForegroundColor Yellow# 尝试从 PATH 查找 pwsh$pwshPath = $null$installedMajor = 0$pwshCmd = Get-Command pwsh -ErrorAction SilentlyContinueif ($pwshCmd) {$pwshPath = $pwshCmd.Sourcetry { $installedMajor = & "$pwshPath" -NoProfile -Command '$PSVersionTable.PSVersion.Major' 2>$null | ForEach-Object { [int]$_ } } catch { $installedMajor = 0 }}# 如果 PATH 未找到,再检查常见目录if (-not $pwshPath) {$possible = @("$env:ProgramFiles\PowerShell\7\pwsh.exe","$env:ProgramFiles\PowerShell\7-preview\pwsh.exe","$env:ProgramFiles(x86)\PowerShell\7\pwsh.exe")foreach ($p in $possible) {if (Test-Path $p) {try { $ver = & "$p" -NoProfile -Command '$PSVersionTable.PSVersion.Major' 2>$null | ForEach-Object { [int]$_ } } catch { $ver = 0 }if ($ver -and $ver -gt 0) { $pwshPath = $p; $installedMajor = $ver; break }}}}# 如果找到了 7+,就用它重新启动脚本if ($installedMajor -ge 7 -and $pwshPath) {Write-Host "✅ 系统已安装 PowerShell $installedMajor,使用 $pwshPath 重新运行脚本。" -ForegroundColor Green# 解析脚本路径:优先使用 $PSCommandPath(PowerShell 3+),回退到 MyInvocation$scriptPath = $PSCommandPathif (-not $scriptPath) { $scriptPath = $MyInvocation.MyCommand.Path }$argsFromInvocation = @()if ($MyInvocation.UnboundArguments) {foreach ($item in $MyInvocation.UnboundArguments) {if ($item -ne $null -and $item -ne '') { $argsFromInvocation += [string]$item }}}$baseArgs = @('-NoProfile', '-ExecutionPolicy', 'Bypass', '-NoExit')$argList = $baseArgs + @('-File', $scriptPath) + $argsFromInvocation$argList = @($argList) | Where-Object { $_ -ne $null -and $_ -ne '' }Start-Process -FilePath $pwshPath -ArgumentList $argList -Verb RunAsreturn $true}else {Write-Host "⚠️ 未找到 PowerShell 7,可手动安装后重试。" -ForegroundColor Yellowreturn $false}
}# 如果需要安装并重启,则退出当前进程(新进程将接手)
if (Restart-InPwsh7IfNeeded) {Write-Host "Exiting current process to allow PowerShell 7+ to handle the rest..." -ForegroundColor Cyanexit 0
}function Write-Log {param([Parameter(Mandatory = $true)][string]$msg,[string]$color = "White")Write-Host $msg -ForegroundColor $color
}Write-Log "`n⚙️ 检查并安装 Git..." "Cyan"
# 检测 git 是否安装
if (Installed 'Git.Git') {Write-Log "✅ Git 已安装,跳过" "Green"
}
else {Write-Log "⚠️ 未检测到 Git,尝试使用 winget 安装 Git..." "Yellow"WingetInstall -PackageId 'Git.Git' -DisplayName 'Git'# 刷新 PATH$env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User") 
}Write-Log "`n⚙️ 检查并安装 Visual Studio Code..." "Cyan"
# 检测 vscode 是否安装
if (Installed 'Microsoft.VisualStudioCode') {Write-Log "✅ Visual Studio Code (code) 已安装,跳过" "Green"
}
else {Write-Log "⚠️ 未检测到 Visual Studio Code,尝试使用 winget 安装 VS Code..." "Yellow"WingetInstall -PackageId 'Microsoft.VisualStudioCode' -DisplayName 'Visual Studio Code'# 刷新 PATH$env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User") 
}Write-Log "`n⚙️ 检测并安装 Volta ..." "Cyan"# --------------------------
# 检查环境变量 VOLTA_FEATURE_PNPM
# --------------------------
$val = [System.Environment]::GetEnvironmentVariable("VOLTA_FEATURE_PNPM", "Machine")
if (-not $val) {$val = [System.Environment]::GetEnvironmentVariable("VOLTA_FEATURE_PNPM", "User")
}if ($val -eq "1") {Write-Log "✅ VOLTA_FEATURE_PNPM 已设置,跳过" "Green"
}
else {$isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)if ($isAdmin) {[System.Environment]::SetEnvironmentVariable("VOLTA_FEATURE_PNPM", "1", "Machine")Write-Log "✅ 已设置系统级别的环境变量 VOLTA_FEATURE_PNPM = 1" "Green"}else {[System.Environment]::SetEnvironmentVariable("VOLTA_FEATURE_PNPM", "1", "User")Write-Log "⚠️ 未以管理员身份运行,已设置用户级别的环境变量 VOLTA_FEATURE_PNPM = 1" "Yellow"}
}if (Installed 'Volta.Volta') {Write-Log "✅ Volta 已安装,跳过" "Green"
}
else {Write-Log "⚠️ Volta 未安装,尝试使用 winget 安装 Volta..." "Yellow"winget install Volta.Volta --accept-source-agreements --accept-package-agreementsif ($LASTEXITCODE -eq 0) {Write-Log "✅ 已通过 winget 安装 Volta 成功" "Green"# 尝试刷新 PATH 环境变量,使 volta 立即可用$env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" +[System.Environment]::GetEnvironmentVariable("Path", "User")# 检查 volta 是否立即可用if (!(Get-Command volta -ErrorAction SilentlyContinue)) {Write-Log "⚠️ volta 暂不可用,可能需要重新打开终端。继续尝试执行安装..." "Yellow"}}else {Write-Log "❌ 使用 winget 安装 Volta 失败,请手动检查。" "Red"}
}# ==========================
# 使用 Volta 安装 NodeJS 和 pnpm
# ==========================
Write-Log "`n⚙️ 安装 NodeJS 和 pnpm ..." "Cyan"$nodeInstalled = volta list node | Select-String "default" -ErrorAction SilentlyContinue
if ($nodeInstalled) {Write-Log "✅ NodeJS 已安装,跳过" "Green"
}
else {volta install nodeif ($LASTEXITCODE -eq 0) {Write-Log "✅ NodeJS 已通过 Volta 安装成功" "Green"}else {Write-Log "❌ 使用 Volta 安装 NodeJS 失败,请手动检查 Volta 日志或终端输出。" "Red"}
}$pnpmInstalled = volta list pnpm | Select-String "default" -ErrorAction SilentlyContinue
if ($pnpmInstalled) {Write-Log "✅ pnpm 已安装,跳过" "Green"
}
else {volta install pnpmif ($LASTEXITCODE -eq 0) {Write-Log "✅ pnpm 已通过 Volta 安装成功" "Green"}else {Write-Log "❌ 使用 Volta 安装 pnpm 失败,请手动检查 Volta 日志或终端输出。" "Red"}
}Write-Log "`n🎉 所有步骤完成!" "Green"
Write-Log "请重新打开终端以应用环境变量。" "Yellow"# -------------------------
# 可选软件安装(通过 winget,交互式选择)
# 支持:通过环境变量 WEB_ENV_SETUP_INSTALL_OPTIONAL=1 跳过交互并自动安装所有可选软件
# -------------------------
Write-Log "`n⚙️ 可选软件安装(Snipaste, Chrome, Firefox, QQ, 微信)..." "Cyan"$optionalPkgs = @(@{ Id = 'liule.Snipaste'; Name = 'Snipaste'; },@{ Id = 'Google.Chrome'; Name = 'Google Chrome'; },@{ Id = 'Mozilla.Firefox'; Name = 'Mozilla Firefox'; },@{ Id = 'Tencent.QQ'; Name = 'QQ'; },@{ Id = 'Tencent.WeChat'; Name = 'WeChat'; }
)function Show-MultiSelect {param([Parameter(Mandatory = $true)][string[]]$Options,[string]$Title = "请选择(上下键切换,空格选择,回车确认,Esc 取消)")$selected = @()for ($i = 0; $i -lt $Options.Count; $i++) { $selected += $false }$cursor = 0function RenderAll {Clear-HostWrite-Host $Title -ForegroundColor Cyanfor ($i = 0; $i -lt $Options.Count; $i++) {$mark = if ($selected[$i]) { '[√]' } else { '[ ]' }if ($i -eq $cursor) { Write-Host "> $mark $($Options[$i])" -ForegroundColor Cyan } else { Write-Host "  $mark $($Options[$i])" }}}RenderAllwhile ($true) {$key = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')$vk = $key.VirtualKeyCode$ch = $key.Character# 兼容不同主机对回车/ESC的编码:CR(13)、LF(10)、ESC(27)if ($vk -eq 13 -or $ch -eq "`r" -or $ch -eq "`n") { break }if ($vk -eq 27 -or ([int][char]$ch) -eq 27) { $selected = @(); break }switch ($vk) {38 { if ($cursor -gt 0) { $cursor-- } else { $cursor = $Options.Count - 1 }; RenderAll } # Up40 { if ($cursor -lt $Options.Count - 1) { $cursor++ } else { $cursor = 0 }; RenderAll } # Down32 { $selected[$cursor] = -not $selected[$cursor]; RenderAll }                            # Spacedefault {# 某些主机 Space 可能表现为字符而非 VK;再做一次字符判断if ($ch -eq ' ') { $selected[$cursor] = -not $selected[$cursor]; RenderAll }}}}$result = @()for ($i = 0; $i -lt $Options.Count; $i++) { if ($selected[$i]) { $result += $i } }Write-Host ""return $result
}$names = $optionalPkgs | ForEach-Object { $_.Name }
$sel = $null
$sel = Show-MultiSelect -Options $names -Title "请选择要安装的可选软件(空格切换,回车确认):"
$selCount = $sel.Countif ($null -eq $sel -or $selCount -eq 0) {Write-Log "ℹ️ 未选择任何可选软件,跳过安装。" "Yellow"
}
else {Write-Log "ℹ️ 开始安装选中软件..." "Yellow"foreach ($i in $sel) {$pkg = $optionalPkgs[$i]# 再次检测路径$found = winget list --id $pkg.Id | Select-String $pkg.Idif ($found) { Write-Log "✅ 检测到 $($pkg.Name) 已安装,跳过安装。" "Green"; continue }Write-Log "⚠️ 使用 winget 安装 $($pkg.Name)..." "Yellow"WingetInstall -PackageId $pkg.Id -DisplayName $pkg.Name}
}# 刷新 PATH(尝试让新安装的应用生效)
$env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")if ($global:WebEnvLog) {try { Stop-Transcript -ErrorAction SilentlyContinue } catch { }Write-Host "日志已保存到:$global:WebEnvLog" -ForegroundColor Cyan
}

脚本已发布到 Github。

2️⃣ 运行脚本

右键点击脚本 → 选择 “使用 PowerShell 运行”
或者在 Powershell 命令行执行:

.\web-env-setup.ps1

🧩 小结

  • 这份脚本非常适合重装系统后快速恢复前端开发环境
  • 所有安装均通过 winget 官方包管理器完成
  • Volta 保证 Node 与 pnpm 版本隔离与统一
  • 支持交互选择可选软件,灵活方便

❤️ 写在最后

如果你也经常重装系统或想快速搭建开发环境,希望这个脚本能帮到你。
欢迎点赞 👍 + 收藏 ⭐ + 评论 💬 一下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/944329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设置模式(Leo)

设计模式 工厂方法模式(解耦): 简单工厂模式: ​ 抽象产品:定义了产品的规范,描述了产品的特性和功能 ​ 具体产品:实现或继承抽象产品的子类 ​ 具体工厂:提供了创建产品的方法,调用者通过该方法来获取产品开…

深入解析:C# .NetCore WebApi 性能改进 响应压缩

深入解析:C# .NetCore WebApi 性能改进 响应压缩pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

利用客户端路径遍历实现CSRF攻击 - CSPT2CSRF技术解析

本文深入探讨如何利用客户端路径遍历漏洞执行跨站请求伪造攻击,介绍CSPT2CSRF技术原理,包含漏洞来源与接收器分析,以及在Mattermost和Rocket.Chat等主流应用中的实际案例。利用客户端路径遍历执行跨站请求伪造 - 介…

SDE表空间过大分析(STATES,STATE_LINEAGES表过大)

SDE表空间过大分析(STATES,STATE_LINEAGES表过大)一、环境ArcGIS10.1 Oracle11G二、问题描述在进行数据库巡检时候,发现SDE表空间占用较大(超过40GB),因我们使用的时候SDE表空间没有存储任何用户数据,只有SD…

卓越SAP实施,铸就企业数字核心——哲讯科技,您值得信赖的数字化转型伙伴

在当今瞬息万变的商业环境中,数字化转型已不再是选择题,而是生存题。而SAP系统,作为全球500强企业背后的管理基石,无疑是这场变革中最强有力的引擎。然而,“拥有SAP”与“成功用好SAP”之间,相隔着一道名为‘实施…

CF 2132 E. Arithmetics Competition

E.Arithmetics Competition原题链接 题意简述在算术比赛中,参赛者需要用手中的纸牌算出尽可能高的总和。在 "fst_ezik "队中,瓦迪姆有 \(n\) 张数字为 \(a_i\) 的牌,科斯佳有 \(m\) 张数字为 \(b_i\) 的牌…

增强AI股票预测分析报告 - 2025年10月23日

增强AI股票预测分析报告 - 2025年10月23日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-widt…

2025年质量好的海水淡化反渗透膜,高压反渗透膜厂家最新权威推荐榜

2025年质量好的海水淡化反渗透膜,高压反渗透膜厂家最新权威推荐榜随着全球水资源短缺问题日益严峻,海水淡化技术已成为解决淡水危机的重要途径。反渗透膜作为海水淡化系统的核心组件,其性能直接影响整个系统的效率和…

CXF WebService No operation was found with the name

Webservice 调用带用户名密码的接口 ,CXF中 the namespace on the "definitions" element, is not a valid SOAP version报错!:https://www.cnblogs.com/vipsoft/p/19135628 CXF WebService 授权&动态…

2025年口碑好的园林修剪机推荐TOP品牌企业

2025年口碑好的园林修剪机推荐TOP品牌企业随着城市化进程加快和人们对绿色生活空间需求的提升,园林机械行业迎来了快速发展期。园林修剪机作为园林维护的重要工具,其性能、耐用性和智能化程度直接影响着工作效率和作…

2025年质量好的抽屉阻尼骑马抽,侧帮阻尼骑马抽厂家推荐及选择指南

2025年质量好的抽屉阻尼骑马抽,侧帮阻尼骑马抽厂家推荐及选择指南 抽屉阻尼骑马抽和侧帮阻尼骑马抽作为现代家具五金的核心配件,其质量直接影响家具的使用寿命和用户体验。优质的阻尼骑马抽不仅能提供顺滑静音的推拉…

HC32F472

问题:adc3转换完成后触发dma1传输数据,dma1传输完成后,应该触发进入中断,但是不进中断;查阅参考手册,keil在线调试定位到问题如果,感到此时的自己很辛苦,那告诉自己:容易走的都是下坡路。坚持住,因为你正在走…

2025年比较好的超强承重天地铰链,隐藏天地铰链厂家最新推荐排行榜

2025年比较好的超强承重天地铰链,隐藏天地铰链厂家最新推荐排行榜前言在2025年的家居五金市场中,天地铰链作为高端柜门系统的核心配件,其承重性能、耐久度和美观性已成为消费者和设计师关注的焦点。随着极简主义设计…

fastadmin项目的nginx的配置

server {listen 80;server_name xiaowei.local;root /Users/weiyonglin/Sites/WWW/fastadmin/public;index index.php index.html index.htm;gzip on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_http_vers…

2025年比较好的反弹插入门厂家最新推荐榜

2025年比较好的反弹插入门厂家最新推荐榜反弹插入门作为现代家居五金的重要组成部分,近年来随着全屋定制和智能家居的兴起而备受关注。这类产品不仅提升了家居空间的使用效率,还通过创新的设计改善了用户体验。2025年…

2025年口碑好的滚筒筛土机推荐生产厂家

2025年口碑好的滚筒筛土机推荐生产厂家行业概述滚筒筛土机作为现代建筑工程、矿山开采和土壤处理领域的重要设备,在物料筛分、土壤改良和建筑基础处理等方面发挥着关键作用。随着2025年建筑行业智能化、环保化趋势的加…

国产“小螺纹”——HL-SMA-KHD 实测记录

国产“小螺纹”——HL-SMA-KHD 实测记录前阵子做 18 GHz 采样头,板子空间被 ADC 占得满满当当,只能在边缘塞一只 SMA 母头当射频入口。翻 BOM 时,采购把 Mini-Circuits 的“SMA 母头 PCB 安装”标成 8 周交期,价格…

2025年评价高的全品类全屋五金厂家推荐及选择建议

2025年评价高的全品类全屋五金厂家推荐及选择建议在当今家居装修和建筑行业中,五金配件虽小却扮演着至关重要的角色。优质的五金不仅能够提升家居的整体品质,还能显著延长家具和建筑的使用寿命。随着消费者对家居品质…

2025 年折弯机厂家最新推荐排行榜:聚焦数控 / 电液伺服 / 液压等机型,精选企业助您精准采购

引言 当前制造业加速升级,折弯机作为钣金加工核心设备,其品质直接决定生产效率与产品精度。但市场品牌繁杂,从基础液压机型到高端数控机型,参数差异大、价格跨度广,企业采购时常面临选型难、辨优劣难的问题 —— …

2025年可靠的直流温升试验机厂家推荐及选择建议

2025年可靠的直流温升试验机厂家推荐及选择建议 开篇介绍 直流温升试验机是电气设备、电线电缆、开关插座等行业中不可或缺的检测设备,用于评估产品在长时间通电状态下的温升性能,确保其安全性和可靠性。随着市场需…