docs(win): 分行展示一键部署命令,避免 git 误解析参数
- README: Windows 克隆与启动改为分行,补充单行安全写法与说明 - start.ps1: 无 Git 时 winget/choco 自动安装、PATH 刷新、UTF-8 BOM 与文件头使用说明 Made-with: Cursor
This commit is contained in:
@@ -8,13 +8,23 @@ git clone https://git.51easyai.com/wangbo/easyai.git && cd easyai && chmod +x st
|
|||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
|
在 PowerShell 中**分行执行**下面三行(不要与 `git clone` 粘成一行且漏掉分号,否则 `-ExecutionPolicy` 可能被当成 `git` 的参数,出现 `error: unknown switch 'E'`):
|
||||||
|
|
||||||
```powershell
|
```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` 会闪退。
|
> **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`
|
> - **或**:以管理员身份打开 PowerShell,执行 `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser`,之后可直接运行 `.\start.ps1`
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -438,7 +448,7 @@ PowerShell 默认可能禁止运行脚本,需先执行以下任一方式:
|
|||||||
|
|
||||||
**方式一:临时允许本次运行(推荐)**
|
**方式一:临时允许本次运行(推荐)**
|
||||||
```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
|
```powershell
|
||||||
git clone https://git.51easyai.com/wangbo/easyai.git
|
git clone "https://git.51easyai.com/wangbo/easyai.git" "easyai"
|
||||||
cd easyai
|
Set-Location ".\easyai"
|
||||||
```
|
```
|
||||||
|
|
||||||
2. 在 PowerShell 或 CMD 中运行(二选一)
|
2. 在 PowerShell 或 CMD 中运行(二选一)
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
# 若已设置 ExecutionPolicy,可直接执行
|
# 若已设置 ExecutionPolicy,可直接执行
|
||||||
.\start.ps1
|
.\start.ps1
|
||||||
|
|
||||||
# 未设置时使用 Bypass 方式
|
# 未设置时使用 Bypass 方式(推荐带引号的路径)
|
||||||
powershell -ExecutionPolicy Bypass -File .\start.ps1
|
powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\start.ps1"
|
||||||
```
|
```
|
||||||
|
|
||||||
3. 按提示选择 [1] 本地访问 或 [2] 局域网访问,脚本将自动配置并启动 Docker 服务。
|
3. 按提示选择 [1] 本地访问 或 [2] 局域网访问,脚本将自动配置并启动 Docker 服务。
|
||||||
|
|||||||
@@ -1,4 +1,17 @@
|
|||||||
#Requires -Version 5.1
|
#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
|
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||||||
$OutputEncoding = [System.Text.Encoding]::UTF8
|
$OutputEncoding = [System.Text.Encoding]::UTF8
|
||||||
@@ -138,6 +151,81 @@ function Setup-EnvFiles {
|
|||||||
Ok ".env configured for IP=$($script:DeployIP)"
|
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 {
|
function Test-DockerInstalled {
|
||||||
$docker = Get-Command docker -ErrorAction SilentlyContinue
|
$docker = Get-Command docker -ErrorAction SilentlyContinue
|
||||||
if (-not $docker) { return $false }
|
if (-not $docker) { return $false }
|
||||||
@@ -258,6 +346,7 @@ function Start-Services {
|
|||||||
|
|
||||||
function Main {
|
function Main {
|
||||||
Init-ProjectDir
|
Init-ProjectDir
|
||||||
|
Ensure-Git
|
||||||
|
|
||||||
if ((Test-Path ".env") -and -not $env:DEPLOY_FORCE_RECONFIG -and -not $env:DEPLOY_IP) {
|
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()
|
$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" }
|
$ip = if ($script:DeployIP) { $script:DeployIP } else { "127.0.0.1" }
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "================================"
|
if ($script:DeployDryRun) {
|
||||||
Write-Host " Deployment Done"
|
Write-Host "================================" -ForegroundColor Yellow
|
||||||
Write-Host "================================"
|
Write-Host " 配置已生成(未启动 Docker 服务)" -ForegroundColor Yellow
|
||||||
Write-Host "URL: http://${ip}:3010"
|
Write-Host "================================" -ForegroundColor Yellow
|
||||||
Write-Host "User: admin"
|
Write-Host ""
|
||||||
Write-Host "Password: 123456"
|
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
|
Wait-ForExit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user