标题: [其他] 批处理括弧不对称的问题 [打印本页]
作者: meiszp 时间: 2024-6-25 08:37 标题: 批处理括弧不对称的问题
本帖最后由 meiszp 于 2024-6-28 09:36 编辑
写了一个批处理在远程服务器上运行,系统为windows server 2003 ,远程运行,有时提示“括弧不对称”,输出也是错误的。等一会再运行,可能需要多次尝试,却又不提示,能正确运行。
检查过括弧匹配,set /p 设置也使用了双引号,避免参数里的括弧导致,就是不知原因何在?求指教,谢谢!- @echo off
- setlocal enabledelayedexpansion
-
- rem 先清空Log.txt
- echo off >Log.txt
-
- for %%f in (*.dat) do (
- set "filename=%%~nf"
- echo.
- echo.>>Log.txt
- echo ******************** !filename!.dat ********************
- echo ******************** !filename!.dat ********************>>Log.txt
- set "start2=!time!"
- set /a "startTime2=(1!time:~0,2!-100)*3600+(1!time:~3,2!-100)*60+(1!time:~6,2!-100)"
-
- seal2d.exe !filename!.dat
-
- set "end2=!time!"
- rem 格式化显示运行时间
- set /a "endTime2=(1!time:~0,2!-100)*3600+(1!time:~3,2!-100)*60+(1!time:~6,2!-100)"
- set /a "elapsed2=endTime2-startTime2"
- set /a "hh2=elapsed2/3600"
- set /a "mm2=(elapsed2%%3600)/60"
- set /a "ss2=elapsed2%%60"
- echo.
-
- findstr /m "Program STOP" !filename!.erg
- if !errorlevel! neq 1 (
- echo 网格太多,程序停止,请查看!filename!.erg文件!
- echo 网格太多,程序停止,请查看!filename!.erg文件!>>Log.txt
- ) else (
- findstr /m "NaN" !filename!.3dg !filename!.3ds !filename!.erg !filename!.plo !filename!.res !filename!.sav !filename!.val
- findstr /m "NaN" !filename!.3dg !filename!.3ds !filename!.erg !filename!.plo !filename!.res !filename!.sav !filename!.val >>Log.txt
- if !errorlevel! neq 1 (
- echo 以上输出文件包含"NaN"错误,请检查输入数据!
- echo 以上输出文件包含"NaN"错误,请检查输入数据!>>Log.txt
- ) else (
- echo SEAL2D计算开始时间:!start2!
- echo SEAL2D计算开始时间:!start2!>>Log.txt
- echo SEAL2D计算结束时间:!end2!
- echo SEAL2D计算结束时间:!end2!>>Log.txt
- echo SEAL2D计算时长:!hh2!小时 !mm2!分 !ss2!秒
- echo SEAL2D计算时长:!hh2!小时 !mm2!分 !ss2!秒>>Log.txt
-
- rem SEAL3D计算
- echo.
- set "start3=!time!"
- echo SEAL3D计算开始时间:!start3!
- echo SEAL3D计算开始时间:!start3!>>Log.txt
- set /a "startTime3=(1!time:~0,2!-100)*3600+(1!time:~3,2!-100)*60+(1!time:~6,2!-100)"
-
- seal3d.exe !filename!.dat
-
- rem 格式化显示运行时间
- set "end3=!time!"
- set /a "endTime3=(1!time:~0,2!-100)*3600+(1!time:~3,2!-100)*60+(1!time:~6,2!-100)"
- set /a "elapsed3=endTime3-startTime3"
- set /a "hh3=elapsed3/3600"
- set /a "mm3=(elapsed3%%3600)/60"
- set /a "ss3=elapsed3%%60"
-
- echo.
- echo SEAL3D计算结束时间:!end3!
- echo SEAL3D计算结束时间:!end3!>>Log.txt
- echo SEAL3D计算时长:!hh3!小时 !mm3!分 !ss3!秒
- echo SEAL3D计算时长:!hh3!小时 !mm3!分 !ss3!秒>>Log.txt
- echo.
- findstr /m "NaN" !filename!.3de
- findstr /m "NaN" !filename!.3de>>Log.txt
-
- if !errorlevel! neq 1 (
- echo 3de文件包含"NaN"错误,请检查输入数据!
- echo 3de文件包含"NaN"错误,请检查输入数据!>>Log.txt
- ) else (
- echo 3de文件无误!
- echo 3de文件无误!>>Log.txt
- )
-
- )
- )
- )
-
- endlocal
- echo.
- pause
复制代码
作者: Batcher 时间: 2024-6-25 11:25
回复 1# meiszp
请提供完整代码和报错截图。
如果需要上传文件,请用使用网盘。
如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: meiszp 时间: 7 天前 09:37
回复 2# Batcher
代码和报错截图已提供,请指教。
作者: Five66 时间: 7 天前 10:12
空格问题
time个位数时间时,前面有个空格
例如【 9:11:07.78】9前面有个空格
自己想方法去掉
作者: ppll2030 时间: 7 天前 12:48
本帖最后由 ppll2030 于 2024-6-28 12:49 编辑
time获取的时间如果是上午,得到的小时数为个位数,前面需要补0,你的计算方式才能正确。
所以要在计算秒数的前面,做一下小时数补0的判断就可以了。- if %time:~0,2% leq 9 (set hour=0%time:~1,1%) else (set hour=%time:~0,2%)
- set /a "startTime2=(1!hour!-100)*3600+(1!time:~3,2!-100)*60+(1!time:~6,2!-100)"
复制代码
作者: 77七 时间: 7 天前 13:31
原因4、5楼已说明。
前面不带0,试试直接计算呢- set /a "startTime2=!time:~0,2!*3600+(1!time:~3,2!-100)*60+(1!time:~6,2!-100)"
复制代码
作者: meiszp 时间: 7 天前 13:44
回复 4# Five66
谢谢,一针见血!
作者: meiszp 时间: 7 天前 13:45
回复 5# ppll2030
谢谢热心回复!
作者: meiszp 时间: 7 天前 14:20
本帖最后由 meiszp 于 2024-6-28 14:30 编辑
回复 6# 77七
谢谢热心回复!
开始写的是下面代码,但报八进制错误,后来小时、分钟、秒都做补1,减100消除0开头的影响。- set /a "startTime2=!time:~0,2!*3600+!time:~3,2!*60+!time:~6,2!"
复制代码
还有点疑惑,!time:~0,2!取两个字符,为什么就可以?- set /a "startTime2=!time:~0,2!*3600+(1!time:~3,2!-100)*60+(1!time:~6,2!-100)"
复制代码
作者: 77七 时间: 7 天前 14:49
回复 9# meiszp
进制这事,我也没学习过,知道这回事就行了,平时用的也不多。可以看以下几个例子
- set /a n=7
- echo %n%
- set /a n= 7
- echo %n%
- set /a n=07
- echo %n%
- set /a n=08
- echo %n%
复制代码
作者: aloha20200628 时间: 7 天前 15:51
回复 9# meiszp
以下示例 一样会报进制错误...- set "t=08:11:12.34"
- set/a "_t=(%t:~0,2%*3600)+(%t:~3,2%)*60+(%t:~6,2%)"
复制代码
作者: newswan 时间: 7 天前 21:38
本帖最后由 newswan 于 2024-6-30 20:23 编辑
时间计算 做一个函数出来比较方便- call :C_TimeDiff tt t0 t1
-
- call :C_GetDateTime _dt_
-
- :C_GetDateTime
- SETLOCAL
- for /f "usebackq tokens=1,2 delims==." %%a in (` wmic os get LocalDateTime /Format:List `) do (
- set _%%a_=%%b
- )
- (
- endlocal
- set %1=%_LocalDateTime_:~0,4%-%_LocalDateTime_:~4,2%-%_LocalDateTime_:~6,2% %_LocalDateTime_:~8,2%:%_LocalDateTime_:~10,2%:%_LocalDateTime_:~12,2%
- )
- goto :eof
-
-
- :C_TimeDiff
- SETLOCAL ENABLEDELAYEDEXPANSION
- set _t0_=!%2!
- set _t1_=!%3!
- set _t0_=%_t0_: =0%
- set _t1_=%_t1_: =0%
- for /f "tokens=1-8 delims=:. " %%a in ( " %_t0_% %_t1_% " ) do (
- set/a "_t_=( 1%%e - 1%%a ) * 3600 + ( 1%%f - 1%%b ) * 60 + ( 1%%g - 1%%c )"
- )
- set/a _HH_=%_t_% / 3600
- set/a _mm_=(%_t_% %% 3600) / 60
- set/a _ss_=%_t_% %% 60
- (
- endlocal
- set %1=%_HH_%:%_mm_%:%_ss_%
- )
- goto :eof
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |