วิธีที่ง่ายที่สุดในการจับเวลาเครื่องมือบรรทัดคำสั่ง


9

วิธีที่ง่ายที่สุด / เร็วที่สุดในการจับเวลาเครื่องมือบรรทัดคำสั่งคืออะไร

ไม่ต้องมีความแม่นยำสูง (+/- วินาทีก็โอเค) เนื่องจากฉันคาดหวังว่าจะใช้เวลานาทีหรือแม้กระทั่ง 1 ชั่วโมง + และการเขียนไฟล์แบตช์ก็ทำได้เช่นกัน นอกจากนี้มันไม่จำเป็นต้องทำการคำนวณตรงเวลาเพียงแค่แสดงเวลาเริ่มต้นและเวลาสิ้นสุด


อาจอยู่ใน Stackoverflow
Joey

2
ถ้าฉันต้อง "โปรแกรม" เพื่อให้มันใช้งานได้ ... ทางออกนั้นซับซ้อนเกินไป ต้องมีเครื่องมือบรรทัดคำสั่งหรือโซลูชันแบตช์แบบง่ายสำหรับสิ่งนี้ไม่?
slolife

มีโอกาสมากขึ้นใน Serverfault
Kirill V. Lyadvinsky

โดยทั่วไประบบปฏิบัติการจะให้ความสำคัญกับเวลาที่ CPU ใช้ไปเท่านั้น คำตอบของฉันด้านล่างจะทำสิ่งที่คุณต้องการ ฉันแค่ใช้ไฟล์บันทึกเพื่อจัดเก็บข้อมูล
Axxmasterr

คำตอบ:


19

ฉันมักจะใช้

echo.|time & my_command & echo.|time

เมื่อฉันไม่มีอะไรอยู่ในมือ สิ่งนี้ทำให้เกิดผลลัพธ์ดังต่อไปนี้:

> echo. | time & ping -n 4 localhost> nul & echo. | time
เวลาปัจจุบันคือ: 18: 42: 34,63
ป้อนเวลาใหม่:
เวลาปัจจุบันคือ: 18: 42: 37,68
ป้อนเวลาใหม่:

ไม่สวยและสามารถทำให้สวยขึ้นได้โดยไปที่ท่อเพื่อค้นหา:

echo.|time|findstr current & ping -n 4 localhost > nul & echo.|time|findstr current

หากคุณมีการเปิดใช้งานการขยายล่าช้าตามค่าเริ่มต้น (หรือเริ่ม cmd ด้วย/v:onอาร์กิวเมนต์) คุณสามารถใช้echo !time!โดยไม่ต้องเปลี่ยนวิธีแฮ็กที่น่าเกลียดด้วยการเปลี่ยนเส้นทางอินพุต

หากคุณต้องการใช้แบตช์ไฟล์คุณสามารถทำได้ดังนี้:

@echo Start time: %time%
@%*>nul 2>nul
@echo End time: %time%

ฉันได้เพิ่มการเปลี่ยนเส้นทางไปยัง nul สำหรับทั้ง stdout และ stderr ที่นี่เพราะไม่เช่นนั้นอาจหาจุดเริ่มต้นและจุดสิ้นสุดได้ยาก คุณสามารถลบได้หากไม่เกี่ยวข้องกับคุณ

แต่ทุกวันนี้ฉันใช้TimeThisเป็นส่วนใหญ่ซึ่งตอนนี้ก็ถูกลบไปแล้วเศร้า

PowerShell เสนอวิธีการเช่นกัน:

Measure-Command { my_command }

แต่คุณต้องระวังสิ่งต่าง ๆ ที่ต้องพึ่งพาไดเร็กตอรี่ที่ใช้งานได้ เพื่อให้ทำงานได้อย่างถูกต้องคุณอาจต้องใช้เล่ห์เหลี่ยมเล็กน้อย:

@echo off
setlocal enableextensions

rem Prepare current directory and command line so they
rem can be stuck into a single-quoted PowerShell string.
set "Dir=%CD:'=''%"
set "Cmd=%*"
set "Cmd=%Cmd:'=''%"

rem Prepare command to pass to PowerShell
set Command=
set "Command=&{"
set "Command=%Command%  Set-Location '%Dir%'"
set "Command=%Command%; [Environment]::CurrentDirectory = '%Dir%'"
set "Command=%Command%; $start = Get-Date"
set "Command=%Command%; Write-Host '    Command line : %Cmd%'"
set "Command=%Command%; Write-Host ('    Start time   : ' + $start.ToString())"
set "Command=%Command%; Write-Host"
set "Command=%Command%; iex 'cmd /c %Cmd%'"
set "Command=%Command%; $end = Get-Date"
set "Command=%Command%; Write-Host"
set "Command=%Command%; Write-Host '    Command line : %Cmd%'"
set "Command=%Command%; Write-Host ('    Start time   : ' + $start.ToString())"
set "Command=%Command%; Write-Host ('    End time     : ' + $end.ToString())"
set "Command=%Command%; Write-Host ('    Elapsed time : ' + ($end - $start).ToString())"
set "Command=%Command%; }"

powershell -noprofile -command "%Command%"

endlocal

สิ่งนี้สามารถรันในลักษณะเดียวกับtimethisให้แน่ใจว่าได้หลีกเลี่ยงอัญประกาศด้วย\"ถ้าจำเป็นในบรรทัดคำสั่ง (เหมือนtimethisกัน) ผลผลิตที่ได้จะคล้ายกัน แม้ว่าการเปลี่ยนเส้นทางจะไม่ทำงาน


TimeThis มาจากชุดทรัพยากร Windows 2000 และไม่มีให้บริการอีกต่อไป ในปี 2003 Resource Kit คือ TimeIt ซึ่งไม่ทำงานกับ 64 บิต Win7 ของฉัน สำหรับวิธีการแก้ปัญหา PowerShell ดูsuperuser.com/questions/228056/…
pesche

ที่ดูด แต่ฉันก็ยังมีสิ่งที่ปฏิบัติการได้อยู่ที่นี่ตั้งแต่สมัยโบราณ
Joey

@pesche: ฉันเพิ่มแบตช์ไฟล์ที่สามารถทำหน้าที่แทนการดรอปอินtimethisได้
Joey

4

คุณสามารถใช้ตัวกำหนดเวลาระบบเพื่อเรียกใช้คำสั่งให้คุณ

แผงควบคุม -> ภารกิจตามกำหนดเวลา -> สร้างใหม่ ....

เพียงชี้งานที่กำหนดเวลาไว้ที่คำสั่งที่คุณต้องการเรียกใช้และควรทำสิ่งที่คุณต้องการ

หากคุณต้องการสร้าง logfile ที่เก็บข้อมูลสถานะเวลาคุณอาจต้องการพิจารณาทำสิ่งที่คล้ายกับสคริปต์ด้านบน

ฉันใช้โปรแกรมอรรถประโยชน์ที่เรียกว่า "ตอนนี้" ในการทำเช่นนี้เพราะมันจะสะท้อนวันที่และเวลา สิ่งนี้มีประโยชน์มากสำหรับสคริปต์บรรทัดคำสั่งที่คุณต้องการติดตามในไฟล์บันทึก แต่ขาดสมาร์ทที่จะรวมวันที่ / เวลา มีประโยชน์มากเพราะไม่สนใจคำตอบและจะหายไปเมื่อคุณทำเสร็จแล้ว

ตอนนี้ Utlity สามารถพบได้ที่นี่

ตัวอย่างสคริปต์จะเป็น ...

echo -------------- >>logfile.txt
now Process Starting>> logfile.txt
<commandhere> <target> >> logfile.txt
now process Ending >> logfile.txt
echo -------------- >> logfile.txt

ผลลัพธ์ตัวอย่างจะมีลักษณะ

--------------
Mon Mar 06 14:58:48 2009 Process Starting
GNU Super Duper Process PID 12345! Success
Mon Mar 06 21:47:01 2009 Process Ending
--------------

4

ตัวเลือกอื่นคือการใช้timeคำสั่ง/tที่จะทำให้เวลาปัจจุบันหมดไปที่คอนโซล (หรือเปลี่ยนเส้นทางไปยังบันทึก) โดยไม่ต้องแจ้งให้เวลาที่จะตั้งค่า มีข้อ จำกัด ว่าจะให้ชั่วโมงนาที แต่ไม่ใช่วินาทีและมิลลิวินาที

call time /t  > myLog.log
call mybat   >> myLog.log
call time /t >> myLog.log

น่าเสียดายที่ "time / t" ไม่ได้ส่งออกวินาทีเพียงแค่ "ชั่วโมง: นาที am / pm"
slolife

ใช่แล้วฉันได้อัพเดตคำตอบแล้ว
akf

1

หากคุณมี PowerShell คุณสามารถทำสิ่งนี้ได้ (ทั้งหมดหนึ่งบรรทัดแยกย่อยเพื่อความสะดวกในการอ่าน):

PS C:\> $startTime=Get-Date;ping /n 4 localhost;$endTime=Get-Date;
        echo "Finished in $(($endTime-$startTime).ToString())"

หรือบันทึกสิ่งนี้ลงในไฟล์เพื่อนำมาใช้ใหม่ได้ง่ายขึ้น

# usage: .\timer.ps1 program [arguments]

$startTime = Get-Date;
$prog = $args[0];
$progargs = $args[1..($args.length-1)];

&$prog $progargs

$endTime = Get-Date;

echo "Finished in $(($endTime - $startTime).ToString())";

1
In command prompt:
 wmic path win32_operatingsystem get LocalDateTime
 wmic path win32_operatingsystem get LocalDateTime
 wmic path win32_operatingsystem get LocalDateTime

Output:
C:\Users\Steini> wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.370000+000

C:\Users\Steini>wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.525000+000

C:\Users\Steini>wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.627000+000

15,5ms และ 10,2ms โดยใช้ Ctrl + v จากคลิปบอร์ด


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.