找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 16519|回复: 11

[其他] [已解决]批处理括弧不对称的问题

[复制链接]
发表于 2024-6-25 08:37:39 | 显示全部楼层 |阅读模式
本帖最后由 meiszp 于 2024-7-10 08:30 编辑

写了一个批处理在远程服务器上运行,系统为windows server 2003 ,远程运行,有时提示“括弧不对称”,输出也是错误的。等一会再运行,可能需要多次尝试,却又不提示,能正确运行。
检查过括弧匹配,set /p 设置也使用了双引号,避免参数里的括弧导致,就是不知原因何在?求指教,谢谢!
  1. @echo off


复制代码
发表于 2024-6-25 11:25:13 | 显示全部楼层
回复 1# meiszp


请提供完整代码和报错截图。
如果需要上传文件,请用使用网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
 楼主| 发表于 2024-6-28 09:37:20 | 显示全部楼层
回复 2# Batcher
代码和报错截图已提供,请指教。
发表于 2024-6-28 10:12:47 | 显示全部楼层
空格问题
time个位数时间时,前面有个空格
例如【 9:11:07.78】9前面有个空格
自己想方法去掉
发表于 2024-6-28 12:48:14 | 显示全部楼层
本帖最后由 ppll2030 于 2024-6-28 12:49 编辑

time获取的时间如果是上午,得到的小时数为个位数,前面需要补0,你的计算方式才能正确。
所以要在计算秒数的前面,做一下小时数补0的判断就可以了。
  1. if %time:~0,2% leq 9 (set hour=0%time:~1,1%) else (set hour=%time:~0,2%)
  2. set /a "startTime2=(1!hour!-100)*3600+(1!time:~3,2!-100)*60+(1!time:~6,2!-100)"
复制代码
发表于 2024-6-28 13:31:25 | 显示全部楼层
原因4、5楼已说明。
前面不带0,试试直接计算呢
  1. set /a "startTime2=!time:~0,2!*3600+(1!time:~3,2!-100)*60+(1!time:~6,2!-100)"
复制代码
 楼主| 发表于 2024-6-28 13:44:40 | 显示全部楼层
回复 4# Five66
谢谢,一针见血!
 楼主| 发表于 2024-6-28 13:45:06 | 显示全部楼层
回复 5# ppll2030

谢谢热心回复!
 楼主| 发表于 2024-6-28 14:20:51 | 显示全部楼层
本帖最后由 meiszp 于 2024-6-28 14:30 编辑

回复 6# 77七
谢谢热心回复!

开始写的是下面代码,但报八进制错误,后来小时、分钟、秒都做补1,减100消除0开头的影响。
  1. set /a "startTime2=!time:~0,2!*3600+!time:~3,2!*60+!time:~6,2!"
复制代码
还有点疑惑,!time:~0,2!取两个字符,为什么就可以?
  1. set /a "startTime2=!time:~0,2!*3600+(1!time:~3,2!-100)*60+(1!time:~6,2!-100)"
复制代码
发表于 2024-6-28 14:49:24 | 显示全部楼层
回复 9# meiszp

进制这事,我也没学习过,知道这回事就行了,平时用的也不多。可以看以下几个例子
  
  1. set /a n=7
  2. echo %n%
  3. set /a n= 7
  4. echo %n%
  5. set /a n=07
  6. echo %n%
  7. set /a n=08
  8. echo %n%
复制代码
发表于 2024-6-28 15:51:13 | 显示全部楼层
回复 9# meiszp

以下示例 一样会报进制错误...

  1. set "t=08:11:12.34"
  2. set/a "_t=(%t:~0,2%*3600)+(%t:~3,2%)*60+(%t:~6,2%)"
复制代码
发表于 2024-6-28 21:38:53 | 显示全部楼层
本帖最后由 newswan 于 2024-6-30 20:23 编辑

时间计算 做一个函数出来比较方便


  1. call :C_TimeDiff tt t0 t1

  2. call :C_GetDateTime _dt_

  3. :C_GetDateTime
  4. SETLOCAL
  5. for /f "usebackq tokens=1,2 delims==."  %%a in (` wmic os get LocalDateTime /Format:List `) do (
  6.         set _%%a_=%%b
  7. )
  8. (
  9. endlocal
  10. set %1=%_LocalDateTime_:~0,4%-%_LocalDateTime_:~4,2%-%_LocalDateTime_:~6,2% %_LocalDateTime_:~8,2%:%_LocalDateTime_:~10,2%:%_LocalDateTime_:~12,2%
  11. )
  12. goto :eof


  13. :C_TimeDiff
  14. SETLOCAL ENABLEDELAYEDEXPANSION
  15.         set _t0_=!%2!
  16.         set _t1_=!%3!
  17.         set _t0_=%_t0_: =0%
  18.         set _t1_=%_t1_: =0%
  19.         for /f "tokens=1-8 delims=:. " %%a in ( " %_t0_% %_t1_% " ) do (
  20.                 set/a "_t_=( 1%%e - 1%%a ) * 3600 + ( 1%%f - 1%%b ) * 60 + ( 1%%g - 1%%c )"
  21.         )
  22.         set/a _HH_=%_t_% / 3600
  23.         set/a _mm_=(%_t_% %% 3600) / 60
  24.         set/a _ss_=%_t_% %% 60
  25. (
  26. endlocal
  27. set %1=%_HH_%:%_mm_%:%_ss_%
  28. )
  29. goto :eof


复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 22:03 , Processed in 0.063509 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表