如何让PowerShell脚本重启后继续完成Python环境部署?
解决PowerShell部署Python环境时重启后自动续行的问题
问题背景
需要编写PowerShell脚本快速部署包含Python3、VS Code和JupyterLab的开发环境,要求已安装的应用自动跳过安装步骤。当前脚本大部分功能正常,但卡在安装Python3后需重启PowerShell才能识别环境,进而继续安装PIP和JupyterLab的环节,无法实现重启后自动执行后续步骤。
预期执行流程:
- 检查Chocolatey是否安装,未安装则自动安装
- 检查Python3是否安装,未安装则通过Chocolatey安装
- 检查VS Code是否安装,未安装则通过Chocolatey安装
- 重启PowerShell以识别Python3环境
- 重启后安装PIP(Chocolatey默认不附带)
- 检查JupyterLab是否安装,未安装则自动安装
修改后的完整脚本
# 管理员权限启动脚本(如果未以管理员运行) if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`" -SkipInitialSteps" -Verb RunAs exit } # 处理脚本参数,标记是否跳过初始安装步骤(用于重启后续行) param( [switch]$SkipInitialSteps ) if (-not $SkipInitialSteps) { # 步骤1:检查并安装Chocolatey if (!(Get-Command choco -ErrorAction SilentlyContinue)) { Set-ExecutionPolicy Bypass -Scope Process -Force [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) # 刷新环境变量,让当前会话识别choco $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") } # 步骤2:检查并安装Python3 $pythonInstalled = $false if (Get-Command python -ErrorAction SilentlyContinue) { $pythonInstalled = $true } else { choco install -y python3 --installargs 'ADD_EXPLORER_CONTEXT_MENU_OPENPYTHON=1' $pythonInstalled = $true } # 步骤3:检查并安装VS Code if (!(Get-Command code -ErrorAction SilentlyContinue)) { choco install -y vscode --installargs '--add-to-path=false --install-extension ms-vscode.python' } # 若刚安装了Python,重启PowerShell并传递续行参数 if ($pythonInstalled -and !(Get-Command python -ErrorAction SilentlyContinue)) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`" -SkipInitialSteps" -Verb RunAs exit } } # 步骤4:安装PIP if (!(Get-Command pip -ErrorAction SilentlyContinue)) { choco install pip -y --installargs 'ADD_CMD_TO_PATH=System' # 刷新环境变量 $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") } # 步骤5:检查并安装JupyterLab if (!(Get-Command jupyter-lab -ErrorAction SilentlyContinue)) { pip install jupyterlab } Read-Host -Prompt "安装流程已完成,按回车键退出"
关键改动说明
- 参数传递实现续行:新增
-SkipInitialSteps参数,重启PowerShell时通过该参数跳过前面的Chocolatey、Python3、VS Code安装步骤,直接执行后续的PIP和JupyterLab安装。 - 管理员权限自动检测:脚本启动时自动检查是否为管理员权限,若不是则以管理员身份重启脚本,避免安装过程中权限不足。
- 环境变量实时刷新:安装Chocolatey和PIP后,手动刷新
$env:Path,让当前会话立即识别新安装的命令,减少不必要的重启。 - Python安装后的重启判断:仅当刚安装完Python但当前会话仍无法识别时,才触发重启,避免无意义的重复重启。
内容的提问来源于stack exchange,提问作者bwc
相关产品推荐
相关产品推荐

