bat脚本结合curl与for循环报( was unexpected at this time求助
批处理脚本报错及判断失效问题修复方案
一、( was unexpected at this time 报错修复
根因:
- 已开启延迟变量扩展,但在多层括号包裹的代码块中,使用
%http%这种解析时展开的变量语法,脚本解析到这行时for循环还未执行,%http%是空值,直接导致括号语法解析混乱 - curl命令中的
%{http_code}没有正确转义,批处理中单%会被识别为变量标记,解析出错
修复方法:
- curl命令中的
%{http_code}转义为%%{http_code} - 括号块内所有变量引用改用延迟扩展语法
!变量名!,而非%变量名%
二、if判断始终不生效修复
根因:
- 仍使用
%http%解析时展开语法,此时http变量还未被赋值 - 判断语句两边引号不对称:左值
%http%没有加引号,右值"400"加了引号,永远无法匹配 - 原代码中
exit \b 1写法错误,反斜杠会导致exit命令执行失败
修复方法:
- 变量引用改为
!http!,判断语句修改为对称引号格式if "!http!"=="400" - 将
exit \b 1修正为exit /b 1
三、完整修正后代码
@echo off SetLocal EnableDelayedExpansion & REM 所有变量作用域限制在当前脚本运行周期,执行时才展开而非解析时展开(提示:输出变量用 echo !output!) REM 获取run.bat所在目录的完整路径(不含文件名) set "wrapper_dir=%~dp1dist" set "arch=amd64.exe" set "system=windows" mkdir "%wrapper_dir%" 2>nul & REM 2>nul屏蔽目录已存在的报错 REM 获取最新可用版本号 (for /f %%i in ('curl -f -s https://prysmaticlabs.com/releases/latest') do set "my_version=%%i") || ( echo [31mERROR: 需联网运行. ESC[0m exit /b 1 ) echo ESC[37m最新版本为 %my_version%.ESC[0m IF defined USE_MY_VERSION ( echo [33m检测到自定义版本变量 USE_MY_VERSION=%USE_MY_VERSION%[0m set "reason=按USE_MY_VERSION指定版本" set "my_version=%USE_MY_VERSION%" ) else ( set "reason=自动选择最新发布版本" ) echo 正在使用版本 %my_version%. set "PROGRAM_REAL=%wrapper_dir%\program-%my_version%-%system%-%arch%" if "%~1"=="program-real" ( if exist "!PROGRAM_REAL!" ( echo ESC[32mBeacon chain 已是最新版本.[0m ) else ( echo ESC[35m正在下载Beacon chain %my_version% 到 !PROGRAM_REAL! (!reason!)ESC[0m for /f "delims=" %%i in ('curl --silent -w "%%{http_code}" -L "https://prysmaticlabs.com/releases/beacon-chain-!my_version!-!system!-!arch!" -o "!PROGRAM_REAL!" ') do ( set "http=%%i" echo 响应状态码:!http! ) if "!http!"=="400" ( echo ESC[35m未找到对应版本 %my_version% 的程序文件ESC[0m exit /b 1 ) curl --silent -L "https://prysmaticlabs.com/releases/beacon-chain-!my_version!-!system!-!arch!.sha256" -o "!wrapper_dir!\beacon-chain-!my_version!-!system!-!arch!.sha256" curl --silent -L "https://prysmaticlabs.com/releases/beacon-chain-!my_version!-!system!-!arch!.sig" -o "!wrapper_dir!\beacon-chain-!my_version!-!system!-!arch!.sig" ) )
四、额外优化项
- 所有路径、URL都用双引号包裹,避免路径含空格时执行报错
mkdir命令加2>nul屏蔽目录已存在的冗余报错- 参数判断改为
if "%~1"=="program-real",%~1自动去除参数外层引号,避免传参带引号时判断失败
内容的提问来源于stack exchange,提问作者user443729
相关产品推荐
相关产品推荐

