You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过PowerShell测试多端口连接的脚本问题求助

PowerShell端口检测脚本修复方案

问题说明

需求:任意端口关闭时脚本立即终止;仅当1688(KMS)和135(RPC)端口均开放时,脚本才继续执行。现有两个端口检测方式:tcping检测1688端口,Test-RPC检测135端口(端口关闭返回FALSE,开放返回TRUE)。原脚本无法正常运行,推测是exit 0导致问题,原代码如下:

$areKMSAvailable = tcping -Server 192.168.2.2 -Port 1688

$areRPCAvailable = Test-RPC -ComputerName 192.168.2.2 -Verbose

function ConnectExitKMS {
    Write-Output "Please fix the closed port 1688 before attempting to activate"
    Start-Sleep 10
    exit 0
}

if ( ! $areKMSAvailable) {
    ConnectExitKMS
}

function ConnectExitRPC {
    Write-Output "Please fix the closed port 135 before attempting to activate"
    Start-Sleep 10
    exit 0
}

if ( ! $($areRPCAvailable.EndPointMapperOpen)) {
    ConnectExitRPC
}

问题根源

  1. tcping返回值处理错误:tcping是外部命令,直接赋值给变量得到的是命令输出字符串,而非布尔值。判断!$areKMSAvailable永远不会成立(因为tcping总有输出),导致1688端口关闭时无法触发终止逻辑。
  2. exit 0语义错误:exit 0表示脚本正常退出,不符合端口关闭时的异常终止场景,应该使用非0退出码(如exit 1)来标识错误状态。

修复后的脚本

# 检测1688端口:通过外部命令退出码判断(0为成功,即端口开放)
tcping -Server 192.168.2.2 -Port 1688
$areKMSAvailable = $LASTEXITCODE -eq 0

# 检测135端口:假设Test-RPC返回对象包含EndPointMapperOpen布尔属性
$areRPCAvailable = Test-RPC -ComputerName 192.168.2.2 -Verbose

# 处理1688端口关闭情况
if (-not $areKMSAvailable) {
    Write-Output "请先修复关闭的1688端口再尝试激活"
    Start-Sleep 10
    exit 1
}

# 处理135端口关闭情况
if (-not $areRPCAvailable.EndPointMapperOpen) {
    Write-Output "请先修复关闭的135端口再尝试激活"
    Start-Sleep 10
    exit 1
}

# 两个端口均开放,继续执行后续逻辑
Write-Output "所有端口均开放,开始执行激活流程..."
# 此处添加后续代码

关键修复点

  • 用$LASTEXITCODE -eq 0判断tcping的执行结果,正确获取端口开放状态的布尔值。
  • 将exit 0改为exit 1,明确标记异常终止的错误状态。
  • 简化逻辑,去掉冗余的函数定义,直接在条件判断中处理提示、延迟和退出,提升脚本可读性。

内容的提问来源于stack exchange,提问作者Arbelac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 06:15:24