Batch File IF Thời gian báo cáo đã thực hiện


4

Tôi đang cố gắng viết một tệp bó mất thời gian của lệnh và chuyển đổi nó thành giờ, phút và giây.

Đây là những gì tôi đã có:

@echo off

set /a sec=0
set /a min=0
set /a hrs=0
for /f %%G in ('ping localhost -n 100 >nul') do (
    ping localhost -n 1 >nul
    set /a sec+=1
    if %sec%==60 ( 
        set /a min+=1
        set /a sec=0
    )
    if %min%==60 (
        set /a hrs+=1
        set /a min=0
    ) 
)
echo Time taken: %hrs%:%min%:%sec%.

Tôi tiếp tục nhận được một ") là bất ngờ tại thời điểm này." lỗi. Vòng lặp FOR chắc chắn hoạt động và nó chỉ là câu lệnh IF là vấn đề.

Tôi đã thử sử dụng toán tử THIẾT BỊ và thêm dấu ngoặc kép nhưng không có kết quả. Ai có thể giúp đỡ?

Ngoài ra, tôi đã đọc ở đâu đó rằng toán tử tập hợp có thể không hoạt động theo câu lệnh IF - điều này có đúng không?

Câu trả lời:


2

Lỗi cú pháp của bạn là kết quả của chuyển hướng không thoát của bạn trong mệnh đề FOR ​​IN (). Sau đây sẽ loại bỏ lỗi cú pháp:

for /f %%G in ('ping localhost -n 100 ^>nul') do (

Nhưng kịch bản của bạn dường như hoàn toàn vô dụng. Chuyển hướng mệnh đề IN () PING sang null có nghĩa là không có gì để lặp lại, vì vậy mã trong vòng lặp sẽ không bao giờ kích hoạt. Ngay cả khi bạn loại bỏ chuyển hướng, nó sẽ rất không chính xác.

Tốt hơn là lấy% TIME% khi bắt đầu và kết thúc quá trình, và sử dụng phân tích cú pháp và toán học tương đối đơn giản để giảm thời gian trôi qua xuống còn 1/100 giây. Điều này có thể xử lý thời gian lên tới ~ 24 giờ.

@echo off
setlocal
set "t1=%time%"
rem someCommandThatYouWantToTime
set "t2=%time%"

:: Compute elapsed time as 1/100 seconds
for /f "tokens=1-4 delims=:.," %%a in ("%t1: =0%") do set /a "t1=(((1%%a*60)+1%%b)*60+1%%c)*100+1%%d-36610100"
for /f "tokens=1-4 delims=:.," %%a in ("%t2: =0%") do set /a "t2=(((1%%a*60)+1%%b)*60+1%%c)*100+1%%d-36610100, tDiff=t2-t1"
if %tDiff% lss 0 set /a tDiff+=24*60*60*100

echo Elapsed time = %tDiff% centiseconds

:: Convert centiseconds into hours, minutes, decimal seconds
set /a "f=tDiff%%100, s=(tDiff/100)%%60, m=(tDiff/100/60)%%60, h=tDiff/100/60/60"
if %f% lss 10 set "f=0%f%"
if %s% lss 10 set "s=0%s%"
if %m% lss 10 set "m=0%m%"
if %h% lss 10 set "h=0%h%"

echo Elapsed time = %h%:%m%:%s%.%f%

Nếu tôi đặt% TIME% cho một biến, tôi sẽ tách nó thành giờ, phút và giây như thế nào?
user3155247

@ user3155247 - xem câu trả lời cập nhật
dbenham
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.