docs(win): 分行展示一键部署命令,避免 git 误解析参数

- README: Windows 克隆与启动改为分行,补充单行安全写法与说明
- start.ps1: 无 Git 时 winget/choco 自动安装、PATH 刷新、UTF-8 BOM 与文件头使用说明

Made-with: Cursor
This commit is contained in:
wangbolhr 2026-04-10 16:31:44 +08:00
parent a59b3930bb
commit ce042333c4
2 changed files with 129 additions and 14 deletions

View File

@ -8,13 +8,23 @@ git clone https://git.51easyai.com/wangbo/easyai.git && cd easyai && chmod +x st
### Windows
在 PowerShell 中**分行执行**下面三行(不要与 `git clone` 粘成一行且漏掉分号,否则 `-ExecutionPolicy` 可能被当成 `git` 的参数,出现 `error: unknown switch 'E'`
```powershell
git clone https://git.51easyai.com/wangbo/easyai.git; cd easyai; powershell -ExecutionPolicy Bypass -File .\start.ps1
git clone "https://git.51easyai.com/wangbo/easyai.git" "easyai"
Set-Location ".\easyai"
powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\start.ps1"
```
若必须单行粘贴,请用分号分隔整条命令链:
```powershell
git clone "https://git.51easyai.com/wangbo/easyai.git" "easyai"; Set-Location "easyai"; powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\start.ps1"
```
> **Windows 脚本权限说明**PowerShell 默认禁止运行脚本,直接双击 `start.ps1` 会闪退。
>
> - **推荐**:使用 `powershell -ExecutionPolicy Bypass -File .\start.ps1` 执行,无需修改系统策略
> - **推荐**:使用 `powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\start.ps1"` 执行,无需修改系统策略
> - **或**:以管理员身份打开 PowerShell执行 `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser`,之后可直接运行 `.\start.ps1`
---
@ -438,7 +448,7 @@ PowerShell 默认可能禁止运行脚本,需先执行以下任一方式:
**方式一:临时允许本次运行(推荐)**
```powershell
powershell -ExecutionPolicy Bypass -File .\start.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\start.ps1"
```
**方式二:为当前用户永久放开脚本执行权限**
@ -449,19 +459,21 @@ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
### 启动步骤
1. 克隆并进入目录
1. 克隆并进入目录(**请分行执行**,避免把后续命令当成 `git` 的参数)
```powershell
git clone https://git.51easyai.com/wangbo/easyai.git
cd easyai
git clone "https://git.51easyai.com/wangbo/easyai.git" "easyai"
Set-Location ".\easyai"
```
2. 在 PowerShell 或 CMD 中运行(二选一)
```powershell
# 若已设置 ExecutionPolicy可直接执行
.\start.ps1
# 未设置时使用 Bypass 方式
powershell -ExecutionPolicy Bypass -File .\start.ps1
# 未设置时使用 Bypass 方式(推荐带引号的路径)
powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\start.ps1"
```
3. 按提示选择 [1] 本地访问 或 [2] 局域网访问,脚本将自动配置并启动 Docker 服务。

115
start.ps1
View File

@ -1,4 +1,17 @@
#Requires -Version 5.1
#
# 从 Git 克隆后首次部署(推荐分行复制执行,避免参数被误传给 git
# git clone "https://git.51easyai.com/wangbo/easyai.git" "easyai"
# Set-Location ".\easyai"
# powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\start.ps1"
#
# 若必须一行,请用分号分隔整条链,且 -File 后必须是带引号的脚本路径(不要用 Istart.ps1应为 .\start.ps1
# git clone "https://git.51easyai.com/wangbo/easyai.git" "easyai"; Set-Location "easyai"; powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\start.ps1"
#
# 若出现 error: unknown switch 'E':说明 -ExecutionPolicy 被交给了 git可复现git clone URL -ExecutionPolicy
# 常见原因:整段命令未用分号分隔、或把 powershell 与 git 写在同一行且参数被 git 解析。
# "Istart.ps1" 多为把 ".\start.ps1" 复制错(点反斜杠被看成字母 I
#
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
@ -138,6 +151,81 @@ function Setup-EnvFiles {
Ok ".env configured for IP=$($script:DeployIP)"
}
function Test-GitInstalled {
$git = Get-Command git -ErrorAction SilentlyContinue
if (-not $git) { return $false }
try { & git --version *> $null; return $true } catch { return $false }
}
function Refresh-SessionPath {
try {
$machine = [Environment]::GetEnvironmentVariable("Path", "Machine")
$user = [Environment]::GetEnvironmentVariable("Path", "User")
$parts = @($machine, $user) | Where-Object { $_ }
if ($parts.Count -gt 0) { $env:Path = ($parts -join ";") }
} catch { }
}
function Install-Git {
if (Get-Command winget -ErrorAction SilentlyContinue) {
Step "Installing Git via winget..."
Write-Log "winget install Git.Git"
winget install --id Git.Git -e --accept-source-agreements --accept-package-agreements
if ($LASTEXITCODE -eq 0) {
Start-Sleep -Seconds 2
Refresh-SessionPath
if (Test-GitInstalled) {
Ok "Git installed"
Write-Log "Git available after winget (PATH refreshed)"
return
}
Ok "Git installed. Close this terminal, open a new one, then run this script again."
Write-Log "Git installed via winget, user must refresh shell"
exit 0
}
}
if (Get-Command choco -ErrorAction SilentlyContinue) {
Step "Installing Git via Chocolatey..."
Write-Log "choco install git"
choco install git -y
if ($LASTEXITCODE -eq 0) {
Start-Sleep -Seconds 2
Refresh-SessionPath
if (Test-GitInstalled) {
Ok "Git installed"
Write-Log "Git available after choco (PATH refreshed)"
return
}
Ok "Git installed. Close this terminal, open a new one, then run this script again."
Write-Log "Git installed via choco, user must refresh shell"
exit 0
}
}
Warn "Could not install Git automatically. Please install manually:"
Write-Host " https://git-scm.com/download/win"
Write-Log "Git auto-install failed, user must install manually"
Wait-ForExit
exit 1
}
function Ensure-Git {
if ($env:DEPLOY_SKIP_GIT -eq "1") { return }
if ($env:CI -eq "true") { return }
if ($script:DeployDryRun) { return }
if (Test-GitInstalled) {
Ok "Git installed"
return
}
Write-Host ""
Write-Host "================================"
Write-Host " Git Check"
Write-Host "================================"
Write-Host ""
Warn "Git not found. Attempting automatic install..."
Write-Log "Git missing, running Install-Git"
Install-Git
}
function Test-DockerInstalled {
$docker = Get-Command docker -ErrorAction SilentlyContinue
if (-not $docker) { return $false }
@ -258,6 +346,7 @@ function Start-Services {
function Main {
Init-ProjectDir
Ensure-Git
if ((Test-Path ".env") -and -not $env:DEPLOY_FORCE_RECONFIG -and -not $env:DEPLOY_IP) {
$answer = (Read-Host "Existing .env found. Reconfigure? [y/N]").Trim().ToLower()
@ -288,12 +377,26 @@ function Main {
$ip = if ($script:DeployIP) { $script:DeployIP } else { "127.0.0.1" }
Write-Host ""
Write-Host "================================"
Write-Host " Deployment Done"
Write-Host "================================"
Write-Host "URL: http://${ip}:3010"
Write-Host "User: admin"
Write-Host "Password: 123456"
if ($script:DeployDryRun) {
Write-Host "================================" -ForegroundColor Yellow
Write-Host " 配置已生成(未启动 Docker 服务)" -ForegroundColor Yellow
Write-Host "================================" -ForegroundColor Yellow
Write-Host ""
Write-Host " 预期访问: " -NoNewline; Write-Host "http://${ip}:3010" -ForegroundColor Cyan
Write-Host ""
Write-Host " 默认管理员: admin / 123456启动服务后用于登录" -ForegroundColor DarkGray
} else {
Write-Host "================================" -ForegroundColor Green
Write-Host " 部署成功" -ForegroundColor Green
Write-Host "================================" -ForegroundColor Green
Write-Host ""
Write-Host " 访问地址: " -NoNewline; Write-Host "http://${ip}:3010" -ForegroundColor Cyan
Write-Host ""
Write-Host " -------- 默认管理员(首次登录后请修改密码)--------" -ForegroundColor Yellow
Write-Host " 账号: " -NoNewline; Write-Host "admin" -ForegroundColor White
Write-Host " 密码: " -NoNewline; Write-Host "123456" -ForegroundColor White
}
Write-Host ""
Wait-ForExit
}