@@ -79,15 +79,17 @@ function Set-Proxy {
7979 支持通过环境变量配置默认代理:
8080 - $env:PROXY_DEFAULT_HOST: 默认代理主机 (默认: 127.0.0.1)
8181 - $env:PROXY_DEFAULT_PORT: 默认代理端口 (默认: 7890)
82+ - $env:PROXY_AUTO_ENABLE: 是否允许 auto 自动开启代理 (默认: 1;0/false/off/no/n 表示关闭)
8283
8384 . PARAMETER Command
8485 操作命令: on, off, status, test, docker, container, auto, help。
8586 默认值为 'status'。
8687
8788 . PARAMETER Target
88- 目标主机或端口 。
89+ 目标主机、端口或完整代理 URL 。
8990 如果仅提供端口 (如 7890),则主机默认为 127.0.0.1。
9091 如果提供主机 (如 192.168.1.10),则需要通过 Port 参数提供端口,或使用默认端口。
92+ 如果提供完整 URL (如 http://192.168.1.10:7890),则直接使用该地址的协议、主机和端口。
9193
9294 . PARAMETER Port
9395 代理端口,仅在 Target 为主机时使用。
@@ -100,6 +102,10 @@ function Set-Proxy {
100102 proxy on 192.168.1.100 1080
101103 开启代理,指向 192.168.1.100:1080
102104
105+ . EXAMPLE
106+ proxy on http://192.168.21.90:7890
107+ 使用完整 URL 开启代理。
108+
103109 . EXAMPLE
104110 proxy off
105111 关闭当前会话代理
@@ -127,16 +133,70 @@ function Set-Proxy {
127133 $DefaultHost = if (-not [string ]::IsNullOrWhiteSpace($env: PROXY_DEFAULT_HOST )) { $env: PROXY_DEFAULT_HOST } else { " 127.0.0.1" }
128134 $DefaultPort = if (-not [string ]::IsNullOrWhiteSpace($env: PROXY_DEFAULT_PORT )) { $env: PROXY_DEFAULT_PORT } else { " 7890" }
129135 $NoProxyList = " localhost,127.0.0.1,::1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12"
136+
137+ function Test-ProxyAutoEnable {
138+ <#
139+ . SYNOPSIS
140+ 判断是否允许自动探测并开启代理。
141+
142+ . DESCRIPTION
143+ 通过 PROXY_AUTO_ENABLE 控制 profile 或 auto 命令的自动开启行为;未设置时保持兼容,默认允许自动开启。
144+
145+ . OUTPUTS
146+ System.Boolean。返回 $true 表示允许自动开启,返回 $false 表示跳过自动开启。
147+ #>
148+ param ()
149+
150+ $rawValue = [System.Environment ]::GetEnvironmentVariable(' PROXY_AUTO_ENABLE' )
151+ if ([string ]::IsNullOrWhiteSpace($rawValue )) { return $true }
152+
153+ switch ($rawValue.Trim ().ToLowerInvariant()) {
154+ ' 0' { return $false }
155+ ' false' { return $false }
156+ ' off' { return $false }
157+ ' no' { return $false }
158+ ' n' { return $false }
159+ default { return $true }
160+ }
161+ }
130162
131163 # 内部辅助函数:解析主机和端口
132164 function Get-ProxyEndpoint {
165+ <#
166+ . SYNOPSIS
167+ 解析代理目标参数。
168+
169+ . DESCRIPTION
170+ 兼容端口、主机加端口、完整 URL 三种输入形式,并统一返回代理环境变量使用的 URL。
171+
172+ . PARAMETER InputTarget
173+ 端口、主机或完整代理 URL。
174+
175+ . PARAMETER InputPort
176+ 当 InputTarget 为主机时使用的代理端口。
177+
178+ . OUTPUTS
179+ System.Management.Automation.PSCustomObject。包含 Host、Port、Url 三个字段。
180+ #>
133181 param ($InputTarget , $InputPort )
134182
135183 $hostName = $DefaultHost
136184 $portNum = $DefaultPort
185+ $scheme = " http"
137186
138187 if (-not [string ]::IsNullOrWhiteSpace($InputTarget )) {
139- if ($InputTarget -match ' ^\d+$' ) {
188+ if ($InputTarget -match ' ^[a-zA-Z][a-zA-Z0-9+.-]*://' ) {
189+ $uri = [System.Uri ]$InputTarget
190+ $scheme = $uri.Scheme
191+ $hostName = $uri.Host
192+ if (-not $uri.IsDefaultPort ) {
193+ $portNum = [string ]$uri.Port
194+ }
195+ elseif (-not [string ]::IsNullOrWhiteSpace($InputPort )) {
196+ $portNum = $InputPort
197+ }
198+ }
199+ elseif ($InputTarget -match ' ^\d+$' ) {
140200 $portNum = $InputTarget
141201 }
142202 else {
@@ -146,7 +206,7 @@ function Set-Proxy {
146206 }
147207 }
148208 }
149- return [pscustomobject ]@ { Host = $hostName ; Port = $portNum ; Url = " http ://${hostName} :${portNum} " }
209+ return [pscustomobject ]@ { Host = $hostName ; Port = $portNum ; Url = " ${scheme} ://${hostName} :${portNum} " }
150210 }
151211 }
152212
@@ -185,6 +245,11 @@ function Set-Proxy {
185245 }
186246
187247 " auto" {
248+ if (-not (Test-ProxyAutoEnable )) {
249+ Write-Verbose " PROXY_AUTO_ENABLE 已关闭,跳过代理自动开启。"
250+ return
251+ }
252+
188253 # 自动尝试连接默认端口,如果通了就开启
189254 $endpoint = Get-ProxyEndpoint - InputTarget $null - InputPort $null
190255 try {
0 commit comments