分享

系统函数

 JT_man 2012-04-08

目录

1、获取系统版本
2、判断服务状态
3、延时
4、计时器
5、获取启动时间
 

1、GetOS

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:GetOS os
::
:: 作者:Ritchie Lawrence, 2003-09-18. 版本 1.0
::
:: 功能:获取操作系统版本。
::       适用于 NT4/2000/XP/2003.
::
:: 参数:%1 该变量用于接收操作系统版本(引用调用)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "cmd=net config work^|findstr/b /c:"软件版本""
for /f "tokens=1-2 delims=." %%a in ('%cmd%') do (
  for %%z in (%%a%%b) do set o=%%z)
endlocal & set "%1=%o:40=NT40%" & (goto :EOF)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

参数

%1 该变量用于接收操作系统版本(引用调用)

返回值

Value

Operating System

NT40

Microsoft Windows NT 4.0

2000

Microsoft Windows 2000

2002

Microsoft Windows XP

2003

Microsoft Windows 2003

实例

@echo off & setlocal ENABLEEXTENSIONS
call :GetOS ver
echo/操作系统版本是:%ver%
goto :EOF
 

备注

该函数依赖于命令行解释器的版本。

参考


2、IsRunning

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:IsRunning %svc%
::
:: 作者:Ritchie Lawrence, 2003-10-08. 版本 1.0
::
:: 功能:如果指定的服务正在运行,errorlevel 被设置为 0,否则被设置为 1。
::       适用于 NT4/2000/XP/2003.
::
:: 参数:%1 待检测服务的显示名称(传值调用)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "svc=%1"
set svc=%svc:"=%
net start | findstr/i /b /e /c:"   %svc%" >nul
endlocal & goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

参数

%1 待检测服务的显示名称(传值调用)

返回值

见上述参数。

实例

@echo off & setlocal ENABLEEXTENSIONS
call :IsRunning "Task Scheduler" && echo/正在运行 || echo/不在运行
goto :EOF

备注

注,使用 Findstr 命令的 /b 和 /e 是为了尽可能地避免出错。如果当“Server”服务正在运行而且其它服务里面也包含字符“server”的时候,不使用这两个开关的话可能出错。另外要注意,"   %svc%"双引号里面有三个空格。

谨记,处于暂停状态的服务会被 net 命令认为是正在运行的。如果一定要知道服务是正在运行并且没有被暂停,Windows NT4 和 2000 下需要使用第三方工具,Windows XP 和 2003 使用自带的工具 SC.exe。

参考

无。


3、Sleep

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Sleep %secs%
::
:: 作者:Ritchie Lawrence, 2003-09-16. 版本 1.0
::
:: 功能:在批处理文件中延时指定秒数。
::       适用于 NT4/2000/XP/2003.
::
:: 参数:%1 延时的秒数(传值调用)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set /a n=%1+1
ping -n %n% 127.0.0.1 >nul
endlocal & goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

参数

%1 延时的秒数(传值调用)

返回值

见上述参数。

实例

@echo off
call :Sleep 5
goto :EOF
 

备注

该函数基于 Clay Calvert 的思路

参考

Timer


4、Timer

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Timer ID
::
:: 作者:Ritchie Lawrence, 2002-10-10. 版本 1.1
:: 更新 2007-10-31 - 感谢 Fabricio 和 Darren
::
:: 功能:返回从第一次调用该函数到最后一次调用该函数所经过的秒数。
::       适用于 NT4/2000/XP/2003.
::
:: 参数:%1 (引用调用)第一次调用该函数的时候,该变量被初始化为“<last>
::       <first> <init>”,<last> 和 <first> 是 0,<init> 是自从
::       1970-01-01 00:00:00 以来所经过的秒数。该值被用于随后的调用,以判断
::       从第一次调用(<first>)该函数到最后一次调用(<last>)该函数
::       所经过的秒数。
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS&call set ID=%%%1%%
set t=2&if "%date%z" LSS "A" set t=1
for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('echo/^|date') do (
  for /f "tokens=%t%-4 delims=.-/ " %%d in ('date/t') do (
    set %%a=%%d&set %%b=%%e&set %%c=%%f))
for /f "tokens=5-7 delims=:. " %%a in ('echo/^|time') do (
  set hh=%%a&set nn=%%b&set ss=%%c)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
set /a hh=100%hh%%%100,nn=100%nn%%%100,ss=100%ss%%%100
set /a j=j*86400+hh*3600+nn*60+ss
for /f "tokens=1-3 delims= " %%a in ('echo/%ID%') do (
  set l=%%a&set f=%%b&set c=%%c)
if {%c%}=={} endlocal&set %1=0 0 %j%&goto :EOF
set /a l=j-c-f,f+=l
endlocal&set %1=%l% %f% %c%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 

参数

%1 (引用调用)第一次调用该函数的时候,该变量被初始化为“<last> <first> <init>”,<last> 和 <first> 是 0,<init> 是自从 1970-01-01 00:00:00 以来所经过的秒数。该值被用于随后的调用,以判断从第一次调用(<first>)该函数到最后一次调用(<last>)该函数所经过的秒数。

返回值

见上述参数。

实例

@echo off & setlocal
set var=
call :Timer var
call :show

::wait about 3 seconds
ping 127.0.0.1 -n 4 >nul
call :Timer var
call :show

::wait about 7 seconds
ping 127.0.0.1 -n 8 >nul
call :Timer var
call :show
goto :EOF

:show
for /f "tokens=1-2 delims= " %%a in ('echo/%var%') do (
  echo/从最后一次调用经过了 %%a 秒,从第一次调用经过了 %%b秒
)
goto :EOF

 

备注

第一次调用该函数,应传递一个未定义的变量。

多个计时器可以并发使用,只需为每个实例使用不同的变量名即可。更多信息见函数头。

更新:修正倒数第二行中的错误(原来是:set /a l=j-c-l,f+=l) - 感谢 Fabricio 和 Darren 看出了这个错误。

参考

Sleep


5、Uptime

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:Uptime days hours mins [secs]
::
:: 作者:Ritchie Lawrence, 2003-09-24. 版本 1.0
::
:: 功能:获取自从上次系统启动经历的天数、小时数、分钟数、秒钟数。
::       适用于 NT4/2000/XP/2003.
::
:: 参数:%1 该变量用于接收启动的天数(引用调用)
::       %2 该变量用于接收启动的小时数(引用调用)
::       %3 该变量用于接收启动的分钟数(引用调用)
::       %4 该变量用于接收启动的秒钟数(引用调用)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS & set "c=net statistics work"
set t=2&if "%date%z" LSS "A" set t=1
for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('echo/^|date') do (
  for /f "tokens=%t%-4 delims=.-/ " %%d in ('date/t') do (
    set %%a=%%d&set %%b=%%e&set %%c=%%f))
for /f "tokens=5-8 delims=:. " %%a in ('echo/^|time') do (
  set "hh=%%a" & set "nn=%%b" & set "ss=%%c")
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
if 1%hh% LSS 20 set hh=0%hh%
set /a hh=100%hh%%%100,nn=100%nn%%%100,f=j*1440+hh*60+nn
for /f "tokens=3-8 delims=/:M " %%a in ('%c%^|findstr/b /c:"Stat"') do (
  set mm=%%a&set dd=%%b&set yy=%%c&set hh=%%d&set nn=%%e%%f)
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
if 1%hh% LSS 20 set hh=0%hh%
if {%nn:~2,1%} EQU {P} if "%hh%" NEQ "12" set hh=1%hh%&set/a hh-=88
if {%nn:~2,1%} EQU {A} if "%hh%" EQU "12" set hh=00
if {%nn:~2,1%} GEQ {A} set nn=%nn:~0,2%
set /a hh=100%hh%%%100,nn=100%nn%%%100,s=j*1440+hh*60+nn,n=f-s
set /a d=n/1440,n%%=1440,h=n/60,n%%=60
endlocal & set "%1=%d%" & set "%2=%h%" & set "%3=%n%" ^
  & (if "%4" NEQ "" set "%4=%ss%") & goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

参数

%1 该变量用于接收启动的天数(引用调用)
%2 该变量用于接收启动的小时数(引用调用)
%3 该变量用于接收启动的分钟数(引用调用)
%4 该变量用于接收启动的秒钟数(引用调用)

返回值

见上述参数。

实例

@echo off & setlocal ENABLEEXTENSIONS
call :Uptime d h n s
echo/系统运行了:%d% 天,%h% 小时,%n% 分,%s% 秒。
goto :EOF

 

备注

该函数获取的启动时间通常会比第三方程序(比如 Resource Kit 中的 SrvInfo 还有 sysinternals 中的 PsInfo)获取的启动时间少 30 秒左右。

参考


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多