脚本适用于CMD,但不适用于批处理

时间:2017-04-12 21:26:37

标签: batch-file cmd

我在下面有这个脚本来跟踪脚本每个部分的处理时间。当我在CMD提示符中运行它时,它运行正常,但是当放入.bat时,它无法运行。这也是由两个IF语句构成的。 还向@driblio喊道,我是从这里得到的。

@echo off

set starttime=%TIME%
set startcsec=%STARTTIME:~9,2%
set startsecs=%STARTTIME:~6,2%
set startmins=%STARTTIME:~3,2%
set starthour=%STARTTIME:~0,2%
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%)

::Process

set endtime=%time%
set endcsec=%endTIME:~9,2%
set endsecs=%endTIME:~6,2%
set endmins=%endTIME:~3,2%
set endhour=%endTIME:~0,2%
if %endhour% LSS %starthour% set /a endhour+=24
set /a endtime=(%endhour%*60*60*100)+(%endmins%*60*100)+(%endsecs%*100)+(%endcsec%)

set /a timetaken= ( %endtime% - %starttime% )
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%

echo.
echo Took: %timetaken% sec.

1 个答案:

答案 0 :(得分:4)

阅读整个 set /?

  

数字值是十进制数,除非前缀为0x   十六进制数,八进制数0。所以0x12是一样的   因为18022相同。请注意,八进制表示法可以   令人困惑0809 无效数字,因为8和   9不是有效的八进制数字。

因此echo "%startttime%" 可以返回类似

的内容
" 9:08:09.04"
    ↑↑          invalid in set /a 08
       ↑↑       invalid in set /a 09
          ↑↑      valid in set /a 04

使用

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
set starttime=%TIME%
rem debugging output echo "%starttime%"
set /A startcsec=1%STARTTIME:~9,2% %% 100
set /A startsecs=1%STARTTIME:~6,2% %% 100
set /A startmins=1%STARTTIME:~3,2% %% 100
set starthour=%STARTTIME:~0,2%
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%)
rem debugging output set start

::Process
:: pause to ensure that endtime >> starttime
pause

set endtime=%time%
rem debugging output echo "%endtime%"
set /A endcsec=1%endTIME:~9,2% %% 100
set /A endsecs=1%endTIME:~6,2% %% 100
set /A endmins=1%endTIME:~3,2% %% 100
set endhour=%endTIME:~0,2%
if %endhour% LSS %starthour% set /a endhour+=24
set /a endtime=(%endhour%*60*60*100)+(%endmins%*60*100)+(%endsecs%*100)+(%endcsec%)
rem debugging output set end

set /a timetaken= ( %endtime% - %starttime% )
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%

echo.
echo Took: %timetaken% sec.

请注意,上面的代码段仍然取决于区域设置和用户首选项。对于区域设置和用户首选项 独立解决方案,请使用wmic os get localdatetime而不是%time%的输出,如下所示:

for /F %%G in ('wmic OS get localdatetime /Value ^| find "="') do @set %%G

然后,%localdatetime%将包含类似20170413030820.447000+120的内容(固定长度)CIM_DATETIME format yyyymmddHHMMSS.mmmmmmsUUU,格式中的字段为

  
      
  • yyyy四位数年份(0000至9999)。您的实施可以限制支持的范围。例如,实现可以   仅支持1980年至2099年。
  •   
  • mm两位数的月份(01到12)。
  •   
  • dd每月两位数的日期(01到31日)。该值必须适合该月份。例如,2月31日无效。   但是,您的实现不必检查有效数据。
  •   
  • HH使用24小时制(00至23)的一天两位数小时。
  •   
  • MM小时内的两位数分钟(00到59)。
  •   
  • SS分钟内的两位数秒(00到59)。
  •   
  • mmmmmm秒中的六位数微秒(000000到999999)。您的实施不必支持   使用此字段进行评估。但是,这个领域必须始终如此   目的是为了保持字符串的固定长度。
  •   
  • s加号(+)或减号( - )表示协调世界时(UTC)的正偏差或负偏差。
  •   
  • UUU三位数偏移量,表示始发时区偏离UTC的分钟数。对于WMI,鼓励,   但不是必需的,将时间转换为GMT(UTC偏移量为零)。
  •