Cần số 0 hàng đầu cho tập lệnh bó sử dụng biến% time%


26

Tôi đã gặp một lỗi trong tập lệnh DOS sử dụng dữ liệu ngày và giờ để đặt tên tệp. Vấn đề là tôi đã kết thúc với một khoảng trống vì biến thời gian không tự động cung cấp số 0 hàng đầu cho giờ <10. Vì vậy, việc chạy> echo% time% trả lại: '9: 29: 17,88'.

Có ai biết một cách để điều kiện số không hàng đầu để khắc phục điều này?

Thông tin thêm: Lệnh đặt tên tệp của tôi là:

set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log

kết thúc là: C: \ Temp \ robolog_20100602_ 93208.log (cho 9:23 sáng).

Câu hỏi này có liên quan đến câu hỏi này .

Cảm ơn


Có thể nhận giá trị giờ được đệm ... FOR / F "TOKENS = 1 DELIMS =:" %% A IN ('TIME / T') DO SET HH = %% A sau đó thay thế% time: ~ 0,2% với% HH% Tôi đã hy vọng một giải pháp nhỏ gọn hơn, nhưng điều này sẽ hiệu quả.
Ira

Một giải pháp "gọn hơn" sẽ là một thứ gì đó trong ngôn ngữ khác (powershell? Python? Perl? WSH?).
grawity

Chuyển sang đánh dấu câu trả lời của Jesse là giải pháp tôi sử dụng. Nó hoạt động với cả thời gian trước buổi trưa để đệm w / dẫn 0 và cả thời gian sau buổi trưa.
Ira

Câu trả lời:


60

Một cách rất đơn giản là chỉ cần thay thế không gian hàng đầu bằng zero:
echo %TIME: =0%
output:
09:18:53,45


1
nó hoạt động đây là giải pháp đơn giản nhất tôi nghĩ ..
aerobrain

Điều này cũng có thể được thực hiện với nhiều nhân vật? iE tất cả ',', '' và ':'. Hiện tại tôi tạo các biến trung gian nhưng tất nhiên, điều này chỉ hoạt động vì số lượng thay thế ít. Để biết thêm nó sẽ là cồng kềnh.
Devolus

1
Tôi đang sử dụng bước này trong "bước" thứ hai để sửa đổi Giờ: set HH=%time:~-11,2% set MM=%time:~-8,2% set SS=%time:~-5,2% set ISOTIME=%HH: =0%-%MM%-%SS% echo %ISOTIME%Cũng xem ss64.com/nt/syntax-replace.html
xử lý

+1 Đây là câu trả lời ngắn nhất / tốt nhất. Cách tôi sử dụng: set timestring=%TIME: =0%sớm trong cuộc gọi phụ - sau đó chỉ cần làm việc với timestringthay thế (hoặc bất kỳ biến nào bạn sử dụng).
bshea

14

Giải pháp của tôi là sử dụng ý tưởng sau:

SET HOUR=%TIME:~0,2%
IF "%HOUR:~0,1%" == " " SET HOUR=0%HOUR:~1,1%

Tôi thích nó. Đơn giản và trực quan.
Ken

Hoạt động trên các cửa sổ hiện đại, nhưng đưa ra lỗi cú pháp trên máy chủ 2003!
Bác sĩ BDO Adams

Hoạt động hoàn hảo trên 2008+, giải pháp thanh lịch nhất. Cảm ơn bạn.
bjoster

1
but gives syntax error on server 2003- tại sao bạn quan tâm rằng năm 2016?
Marcin Orleansowski

Hoàn hảo trên Dấu nhắc lệnh của Windows 10
Mike Upjohn

5

Ý tưởng tương tự như câu trả lời của Dennis . Vấn đề là độ rộng của %time%luôn luôn giống nhau, vì vậy nó chèn một khoảng trắng ở đầu thay vì trả về một chuỗi ngắn hơn.

Bạn có thể thoát khỏi điều đó với for:

for /f "delims= " %x in ("%time%") do set T=0%x

Phần còn lại ít nhiều giống nhau, sau đó.


2
Giải pháp này hoạt động với> 10 nhưng hiện tại tạo ra '010' cho 10: ...
Devolus

3
Câu trả lời từ Jesse là câu trả lời đúng ...
Simon Sobisch 14/07/2016

Đây là một câu trả lời rất tệ, nó bị hỏng ngay khi có hai chữ số trong giờ. Tôi không thể tin OP đã chọn nó.
thebunnyrules

3

Sử dụng Đóng góp của Jesse, tôi vừa tạo một biến có đầu ra được sửa đổi. Sau đó, tôi tham chiếu biến đó để xây dựng phần giờ.

set NantTime=%time: =0%
nant\bin\nant.exe -nologo+ -debug+ -verbose+ -D:project.config=debug /f:build\default.build -l:logs\architect-build-%DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2%-%NantTime:~0,2%-%time:~3,2%-%time:~6,2%.log 
pause

Với nguồn ban đầu:

set hour=%time: =0%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%hour:~0,2%%time:~3,2%%time:~6,2%.log

Cảm ơn Jesse. Tôi đã bỏ phiếu nếu tôi có điểm danh tiếng.


1

Đối với giải pháp nhỏ gọn nhất thực hiện mọi thứ ở trên, tôi nghĩ rằng

FOR / F "TOKENS = 1-4 DELIMS = /" %% A IN ("% DATE%") DO FOR / F "TOKENS = 1-3 DELIMS = :." %% E IN ("% TIME: = 0%") DO SET logfile = C: \ Temp \ robolog _ %% D %% C %% B _ %% E %% F %% G.log

sẽ làm việc ở đây mà không cần thêm bất kỳ dòng mới vào kịch bản. Có lẽ nó kém thanh lịch hơn nhiều giải pháp lệnh, mặc dù ..


1

Sau đây có thêm một vài dòng nhưng rõ ràng và dễ hiểu. Nó lưu stdout và stderr vào các tệp riêng biệt, mỗi tệp có dấu thời gian. Dấu thời gian bao gồm năm, tháng, ngày, giờ, phút và giây, theo thứ tự đó. Dấu thời gian phải luôn có thành phần ngày quan trọng nhất đầu tiên (năm) và thành phần ít nhất (giây) cuối cùng. Điều đó cho phép danh sách các tập tin được theo thứ tự thời gian. Nếu không có thêm rắc rối, đây là giải pháp của tôi.

:prepare time stamp 
set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%
set hour=%time:~0,2%
:replace leading space with 0 for hours < 10
if "%hour:~0,1%" == " "  set hour=0%hour:~1,1%
set minute=%time:~3,2%
set second=%time:~6,2%
set timeStamp=%year%.%month%.%day%_%hour%.%minute%.%second%

:run the program 
ProgramName.pl 1> RunLogs\out.%timeStamp% ^
               2> RunLogs\err.%timeStamp%

0

Điều này giải quyết một số 0 vào đầu thời gian và lấy hai chữ số cuối của giờ (vị trí bắt đầu phút và giây được thay đổi bởi một). Vì vậy, 3 giờ sáng trở thành "03" rồi "03" và giờ 15 trở thành "015" rồi "15".

set T=0%time%
set T=%T:~1,2%%T:~4,2%%T:~7,2%
set D=%date:~-4%%date:~4,2%%date:~7,2%
set logfile=C:\Temp\robolog_%D%_%T%.log

Ít đọc hơn:

set T=0%time%
set logfile=C:\Temp\robolog_%date:~-4%%date:~4,2%%date:~7,2%_%T:~1,2%%T:~4,2%%T:~7,2%.log

1
Tôi không chắc chắn điều này hoạt động. Nếu tôi chạy 'set T = 0% time%' và đó là 9:38 AM, echo% T% trả lại: '0 9: 38: 54,21', sau đó lấy% T: ~ 1,2% có khoảng trống, không dẫn đầu 0.
Ira

0

Một dòng mã sẽ làm những gì bạn cần:

    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%

Ví dụ: tôi sử dụng% Date% và sau đó thêm số 0 đứng đầu vào một biến tôi sử dụng để xác định xem tôi có cần thay thế không gian hàng đầu bằng số 0 cho% Time% không.

    ::Prepare TimeStamp variable by replacing leading space with 0 for Hours < 10
    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    Echo Started on %Date$ at %TimeStamp%

    :: Insert what you are doing here...

    SET TimeStamp=%Time:~0,8%
    IF "%Time:~0,1%" == " " SET TimeStamp=0%Time:~1,7%
    ECHO Finished on %Date% at %TimeStamp%

0

Điều này tạo ra dấu thời gian có thể sắp xếp và dòng thứ hai đảm bảo không có khoảng trắng cho giờ một chữ số, v.v., để làm cho nó có thể sử dụng được cho các tập lệnh:

set datestamp=%date:~-4%.%date:~-10,-8%.%date:~-7,-5%_%time:~0,2%.%time:~3,2%.%time:~6,2%
set datestamp=%datestamp: =_%

Đầu ra:

2018.02.26__9.47.34


0

Nhờ sự giúp đỡ từ phía trên ... Đây là những gì tôi đang sử dụng:

C:\Windows\System32>SET short=%date:~10,4%-%date:~4,2%-%date:~7,2%
C:\Windows\System32>ECHO -- Short Date: %short%
-- Short Date: 2018-06-27
C:\Windows\System32>SET long=%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%
C:\Windows\System32>ECHO -- Long Date: %long%
-- Long Date: 2018-06-27_10_51_43

Sau đó tôi có các nhật ký được gọi ra trong các công việc Robocopy như thế này:

Có nhiều cái như thế này:

Robocopy C:\Users\ME\Favorites\ %usb%:\Local_PC\Favorites\ /MIR /TEE /FFT /DST /TIMFIX /W:5 /R:5 /NP /LOG+:%usb%:\Robocopy\LOG_%short%.txt

Kết thúc công việc với điều này:

REN %usb%:\Robocopy\LOG_%short%.txt COMPLETE_LOG_%long%.log

COMPLETE_LOG_2018-06-27_10_53_54.log là tệp được tạo ở cuối và có thể sắp xếp theo tên tệp.


0

Câu trả lời của Jesse đã giải quyết vấn đề đổi tên tập tin của tôi bằng cách loại bỏ khoảng trắng trong trường giờ. Đây là cách tôi đặt các biến của mình:

for /f "tokens=1,2,3,4 delims=/ " %%a in ("%date%") do set wday=%%a&set month=%%b&set day=%%c&set year=%%d
for /f "tokens=1,2 delims=:" %%a in ("%time: =0%") do set hour=%%a&set minute=%%b

Nó hoạt động như một nhà vô địch; vì một số lý do ngày không cần điều trị tương tự, nhưng tôi tưởng tượng đó là xuống các thiết lập khu vực.


0
    @echo off



    call :PAD aaa,2,0,grw
    echo [[aaa=%aaa%]]
    pause




rem #### Function PAD ####
    goto :PADEND
    :PAD <var>,<length>,<padchar>,<string>
        set padtot=%~2
        set padchar=%~3
        set padString=%~4
        :StartPADLOOP
            call :len lenpadString,%padString%
            if ["%lenpadString%"] GEQ ["%padtot%"] goto :EndPADLOOP
            set padString=%padchar%%padString%
            goto :StartPADLOOP
        :EndPADLOOP
        set %~1=%padString%
    GOTO :EOF
    :PADEND


rem #### Function LEN ####
    goto :LENEND
    :LEN <var>,<string>
        set LENtempvar=%~2
        rem echo {{S:%LENtempvar%}}
        set LENCOUNT=0    
        :startLENLOOP
            if ["%LENtempvar%"] EQU [""] goto :endLENLOOP
            rem echo {{A:%LENtempvar%}}
            set LENtempvar=%LENtempvar:~0,-1%
            rem echo {{B:%LENtempvar%}}
            set /a LENCOUNT=LENCOUNT+1
        goto :startLENLOOP
        :endLENLOOP
        set %~1=%LENCOUNT%
    GOTO :EOF
    :LENEND

-2
set sFolderName=%time: =0%
xcopy "%UserProfile%\Pictures\*.jpg" Y:\"%DATE%-%sFolderName:~0,2%h%time:~3,2%m%time:~6,2%s-%random%" /I /C /Y

15.06.2015-03h43m34s-5357

5357-%random%"

5
Mặc dù mã được đánh giá cao, nó phải luôn có một lời giải thích đi kèm. Điều này không phải là dài nhưng nó được mong đợi.
peterh nói phục hồi Monica
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.