سؤال

كيف أقوم بطباعة الوقت (في مللي ثانية) في نظام التشغيل Windows دفعة الملف ؟

أريد أن قياس الوقت الذي يمر بين الخطوط في الملف الدفعي ، ولكن ويندوز "حان الوقت /T" لا تتم طباعة ميلي ثانية.

هل كانت مفيدة؟

المحلول

ويجب أن تعمل، قد انقضت %time% قدمت ما يكفي من الوقت بين المكالمات:

@echo OFF

@echo %time%
ping -n 1 -w 1 127.0.0.1 1>nul
@echo %time%

في نظام بلدي أحصل على الإخراج التالية:

<اقتباس فقرة>   

و6: 46: 13.50
   6: 46: 13.60

نصائح أخرى

إذا كنت تفعل شيئا مثل

for /l %%i in (1,1,500) do @echo %time%

أو

if foo (
    echo %time%
    do_something
    echo %time%
)

وبعد ذلك يمكنك ببساطة وضع setlocal enabledelayedexpansion في بداية الملف الدفعي واستخدام !time! بدلا من %time% الذي يحصل على تقييم على التنفيذ، وليس على تحليل الخط (الذي يضم كتل كاملة داخل أقواس).

و"البرنامج" دفعة أدناه يجب أن تفعل ما تريد. يرجى ملاحظة أنه إخراج البيانات في centiseconds بدلا من ميلي ثانية. دقة الأوامر المستخدمة هي الوحيدة centiseconds.

وهنا هو إخراج المثال:

STARTTIME: 13:42:52,25
ENDTIME: 13:42:56,51
STARTTIME: 4937225 centiseconds
ENDTIME: 4937651 centiseconds
DURATION: 426 in centiseconds
00:00:04,26

وهنا هو السيناريو دفعة:

@echo off
setlocal

rem The format of %TIME% is HH:MM:SS,CS for example 23:59:59,99
set STARTTIME=%TIME%

rem here begins the command you want to measure
dir /s > nul
rem here ends the command you want to measure

set ENDTIME=%TIME%

rem output as time
echo STARTTIME: %STARTTIME%
echo ENDTIME: %ENDTIME%

rem convert STARTTIME and ENDTIME to centiseconds
set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100)
set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100)

rem calculating the duratyion is easy
set /A DURATION=%ENDTIME%-%STARTTIME%

rem we might have measured the time inbetween days
if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME%

rem now break the centiseconds down to hors, minutes, seconds and the remaining centiseconds
set /A DURATIONH=%DURATION% / 360000
set /A DURATIONM=(%DURATION% - %DURATIONH%*360000) / 6000
set /A DURATIONS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000) / 100
set /A DURATIONHS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000 - %DURATIONS%*100)

rem some formatting
if %DURATIONH% LSS 10 set DURATIONH=0%DURATIONH%
if %DURATIONM% LSS 10 set DURATIONM=0%DURATIONM%
if %DURATIONS% LSS 10 set DURATIONS=0%DURATIONS%
if %DURATIONHS% LSS 10 set DURATIONHS=0%DURATIONHS%

rem outputing
echo STARTTIME: %STARTTIME% centiseconds
echo ENDTIME: %ENDTIME% centiseconds
echo DURATION: %DURATION% in centiseconds
echo %DURATIONH%:%DURATIONM%:%DURATIONS%,%DURATIONHS%

endlocal
goto :EOF
<اقتباس فقرة>   

و٪ TIME٪ هي في شكل H: MM: SS، CS بعد منتصف الليل، وبالتالي التحول إلى centiseconds> لا يعمل. رؤية آخر باتريك صفعة مع 06:46 يبدو أنه ليس لي فقط.

ولكن مع هذا خطوط bevor يجب سيتم إصلاح هذه المشكلة سهل:

if " "=="%StartZeit:~0,1%" set StartZeit=0%StartZeit:~-10%
if " "=="%EndZeit:~0,1%" set EndZeit=0%EndZeit:~-10%

وشكرا لإلهام جميل بك! أود أن استخدامها في بلدي ام بلاير، فمبيج، مخطوطات الجوارب لقواد mediafiles بلدي لPocketPlayers القديم للمتعة فقط.

عليك أن تكون حذرا مع ما تريد القيام به, لأنه ليس فقط حول الحصول على الوقت.

الدفعة قد المتغيرات الداخلية تمثل تاريخ tme: تاريخ ٪ ٪ ٪ الوقت%.لكنها تعتمد على ويندوز الإعدادات المحلية.

تاريخ ٪ ٪ :

  • دد.مم.yyyy
  • دد.مم.yy
  • د.م.yy
  • dd/MM/yy
  • yyyy-MM-dd

%TIME%:

  • H:mm:ss ، ميللي ثانية
  • HH:mm:ss ، ميللي ثانية

الآن كم السيناريو الخاص بك سوف تعمل ومتى ؟ على سبيل المثال ، إذا كان سيكون أطول من يوم واحد و لا تمر منتصف الليل فإنه بالتأكيد سوف يذهب على نحو خاطئ ، لأن الفرق بين 2 الطوابع الزمنية بين منتصف الليل هو قيمة سالبة!كنت في حاجة التاريخ إلى معرفة المسافة الصحيحة بين أيام, ولكن كيف يمكنك أن تفعل ذلك إذا كان تنسيق التاريخ ليست ثابتة ؟ الأشياء مع تاريخ ٪ ٪ و %TIME% قد يذهب أسوأ و أسوأ إذا كنت لا تزال تستخدم لهم عن الرياضيات الأغراض.

والسبب هو تاريخ ٪ ٪ و %TIME% هي موجودة فقط لاظهار التاريخ و الوقت المستخدم في الإخراج ، عدم استخدامها في العمليات الحسابية.حتى إذا كنت تريد أن تجعل المسافة الصحيحة بين بعض الوقت القيم أو توليد بعض قيمة فريدة من نوعها تعتمد على التاريخ والوقت ثم لديك لاستخدام شيء مختلف و دقة من تاريخ ٪ ٪ و %TIME%.

أنا باستخدام wmic ويندوز مدمج المنفعة إلى طلب مثل هذه الأمور (ضعه في ملف البرنامج نصي):

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE`) do if "%%i" == "LocalDateTime" echo.%%j

أو اكتب في cmd.exe وحدة التحكم:

for /F "usebackq tokens=1,2 delims==" %i in (`wmic os get LocalDateTime /VALUE`) do @if "%i" == "LocalDateTime" echo.%j

وعيب هذا هو بطء الأداء في حالة من كثرة المكالمات.على الألغام الجهاز هو حوالي 12 المكالمات في الثانية.

إذا كنت ترغب في الاستمرار في استخدام هذا ثم يمكنك كتابة شيء من هذا القبيل (get_datetime.الخفافيش):

@echo off

rem Description:
rem   Independent to Windows locale date/time request.

rem Drop last error level
cd .

rem drop return value
set "RETURN_VALUE="

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if "%%i" == "LocalDateTime" set "RETURN_VALUE=%%j"

if not "%RETURN_VALUE%" == "" (
  set "RETURN_VALUE=%RETURN_VALUE:~0,18%"
  exit /b 0
)

exit /b 1

الآن يمكنك تحليل %RETURN_VALUE% somethere في البرنامج النصي الخاص بك:

call get_datetime.bat
set "FILE_SUFFIX=%RETURN_VALUE:.=_%"
set "FILE_SUFFIX=%FILE_SUFFIX:~8,2%_%FILE_SUFFIX:~10,2%_%FILE_SUFFIX:~12,6%"
echo.%FILE_SUFFIX%
scroll top