ต้องการศูนย์นำหน้าสำหรับสคริปต์ชุดงานโดยใช้ตัวแปร% time%


26

ฉันพบข้อผิดพลาดในสคริปต์ DOS ที่ใช้ข้อมูลวันที่และเวลาในการตั้งชื่อไฟล์ ปัญหาคือฉันลงเอยด้วยช่องว่างเพราะตัวแปรเวลาไม่ได้ให้ศูนย์นำหน้าโดยอัตโนมัติสำหรับชั่วโมง <10 ดังนั้นการเรียกใช้> echo% เวลา% ให้ผลตอบแทน: '9: 29: 17.88'

ไม่มีใครรู้วิธีที่จะเป็นศูนย์นำหน้าเพื่อแก้ไขปัญหานี้แบบมีเงื่อนไข?

ข้อมูลเพิ่มเติม: คำสั่งชื่อไฟล์ของฉันคือ:

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

ซึ่งจบลงด้วยการเป็น: C: \ Temp \ robolog_20100602_ 93208.log (สำหรับ 9:23 ในตอนเช้า)

คำถามนี้เป็นคำถามที่เกี่ยวข้องกับคนนี้

ขอบคุณ


เป็นไปได้ที่จะได้รับค่าชั่วโมงเบาะ ... สำหรับ / F "โทเค็น = 1 DELIMS =:" %% A IN ('TIME / T') ทำการ SET HH = %% A แล้วแทนที่% เวลา: ~ 0,2% ด้วย% HH% ฉันหวังว่าจะได้โซลูชันที่กระชับยิ่งขึ้น แต่จะใช้งานได้
Ira

การแก้ปัญหา "กระชับมากขึ้น" จะเป็นสิ่งที่ภาษาอื่น (powershell? python? perl? WSH?)
grawity

เปลี่ยนเพื่อทำเครื่องหมายคำตอบของเจสซี่เป็นวิธีแก้ปัญหาที่ฉันใช้ มันทำงานได้ทั้งเวลาก่อนเที่ยงเพื่อปัด w / นำ 0 และเวลาทหารหลังเที่ยง
Ira

คำตอบ:


60

วิธีที่ง่ายมากคือการแทนที่พื้นที่นำด้วยศูนย์:
echo %TIME: =0%
เอาต์พุต:
09:18:53,45


1
มันได้ผล! นี่เป็นทางออกที่ง่ายที่สุดที่ฉันคิด ..
aerobrain

สามารถใช้อักขระหลายตัวได้หรือไม่ iE all ',', '' และ ':' ขณะนี้ฉันสร้างตัวแปรระดับกลาง แต่แน่นอนว่าใช้ได้เพราะมีจำนวนการเปลี่ยนไม่กี่ตัวเท่านั้น ยิ่งมันจะยุ่งยาก
Devolus

1
ฉันใช้สิ่งนี้ใน "ขั้นตอนที่สอง" เพื่อแก้ไขชั่วโมง: set HH=%time:~-11,2% set MM=%time:~-8,2% set SS=%time:~-5,2% set ISOTIME=%HH: =0%-%MM%-%SS% echo %ISOTIME%ดูss64.com/nt/syntax-replace.html
จัดการ

+1 นี่คือคำตอบที่สั้นที่สุด / ดีที่สุด ฉันใช้งานอย่างไร: set timestring=%TIME: =0%ก่อนการโทรย่อย - จากนั้นก็ใช้งานtimestringแทน (หรือตัวแปรใดก็ได้ที่คุณใช้)
bshea

14

โซลูชันของฉันคือใช้แนวคิดต่อไปนี้:

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

ฉันชอบมัน. ง่ายและใช้งานง่าย
เคน

ทำงานบน windows ที่ทันสมัย ​​แต่ให้ข้อผิดพลาดทางไวยากรณ์บนเซิร์ฟเวอร์ 2003!
ดร. BDO อดัมส์

ทำงานได้อย่างไร้ที่ติในปี 2008+ ทางออกที่สวยงามที่สุด ขอขอบคุณ.
bjoster

1
but gives syntax error on server 2003- ทำไมคุณสนใจในปี 2559
Marcin Orlowski

สมบูรณ์แบบในพรอมต์คำสั่งของ Windows 10
Mike Upjohn

5

ความคิดที่คล้ายกับคำตอบของเดนนิส ปัญหาคือความกว้างของ%time%มันจะเท่ากันเสมอดังนั้นมันจึงแทรกช่องว่างในตอนเริ่มต้นแทนที่จะส่งกลับสตริงที่สั้นกว่า

คุณสามารถกำจัดสิ่งนั้นได้ด้วยfor:

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

ที่เหลือก็มากหรือน้อยเหมือนกันแล้ว


2
โซลูชันนี้ใช้งานได้> 10 แต่ตอนนี้สร้าง '010' สำหรับ 10: ...
Devolus

3
คำตอบจากเจสซีเป็นหนึ่งที่ถูกต้อง ...
ไซมอน Sobisch

นี่เป็นคำตอบที่แย่มาก ๆ มันพังลงทันทีที่มีตัวเลขสองหลักในหนึ่งชั่วโมง ฉันไม่อยากเชื่อว่า OP ได้เลือกไว้
thebunnyrules

3

ด้วยการสนับสนุนของ Jesse ฉันเพิ่งสร้างตัวแปรด้วยเอาต์พุตที่แก้ไข จากนั้นฉันอ้างอิงตัวแปรนั้นเพื่อสร้างส่วนชั่วโมง

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

ด้วยแหล่งที่มาเดิม:

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

ขอบคุณเจส ฉันจะลงคะแนนถ้าฉันมีคะแนนชื่อเสียง


1

สำหรับโซลูชันขนาดเล็กที่สุดที่ใช้งานทุกอย่างข้างต้นฉันคิดว่า

FOR / F "TOKENS = 1-4 DELIMS = /" %% A IN ("% DATE%") ทำเพื่อ / F "TOKENS = 1-3 DELIMS = :. " %% E IN ("% TIME: = 0%") ตั้งค่า logfile = C: \ Temp \ robolog _ %% D %% C %% B _ %% E %% F %% G.log

จะทำงานที่นี่โดยไม่ต้องเพิ่มบรรทัดใหม่ใด ๆ ในสคริปต์ บางทีมันอาจจะดูหรูหรากว่าโซลูชันคำสั่งหลายตัว แต่ ..


1

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

: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

การทำเช่นนี้จะทำให้ศูนย์เป็นจุดเริ่มต้นของเวลาและใช้ตัวเลขสองหลักสุดท้ายของชั่วโมง (ตำแหน่งนาทีและวินาทีถูกเลื่อนโดยหนึ่ง) ดังนั้น 03:00 จึงกลายเป็น "03" จากนั้น "03" และ 15 ชั่วโมงกลายเป็น "015" จากนั้น "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

อ่านง่าย:

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
ฉันไม่แน่ใจว่างานนี้ ถ้าฉันเรียกใช้ 'set T = 0% เวลา%' และเป็น 9:38 น. echo% T% จะให้กลับมา: '0 9: 38: 54.21' ดังนั้นการใช้% T: ~ 1,2% ได้รับพื้นที่ไม่มีผู้นำ 0.
Ira

0

โค้ดหนึ่งบรรทัดจะทำสิ่งที่คุณต้องการ:

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

ตัวอย่างเช่นฉันใช้% Date% แล้วเพิ่มศูนย์นำไปสู่ตัวแปรที่ฉันใช้เพื่อตรวจสอบว่าฉันต้องการแทนที่พื้นที่นำด้วยศูนย์สำหรับ% Time%

    ::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

สิ่งนี้สร้างการประทับเวลาที่เรียงได้และบรรทัดที่สองทำให้แน่ใจว่าไม่มีที่ว่างสำหรับชั่วโมงหลักเดียว ฯลฯ เพื่อให้สามารถใช้งานสคริปต์ได้:

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

เอาท์พุท:

2018.02.26__9.47.34


0

ขอบคุณที่ช่วยจากข้างบน ... นี่คือสิ่งที่ฉันใช้:

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

ฉันมีบันทึกที่เรียกใช้ในงาน Robocopy เช่นนี้:

มีหลายอย่างเช่นนี้:

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

จบงานด้วยสิ่งนี้:

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

COMPLETE_LOG_2018-06-27_10_53_54.log เป็นไฟล์ที่สร้างขึ้นในตอนท้ายและสามารถจัดเรียงตามชื่อไฟล์


0

คำตอบของ Jesse แก้ปัญหาการเปลี่ยนชื่อไฟล์ของฉันโดยกำจัดพื้นที่ในฟิลด์ชั่วโมง นี่คือวิธีที่ฉันตั้งค่าตัวแปรของฉัน:

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

มันทำงานเหมือนแชมป์; ด้วยเหตุผลบางอย่างวันที่ไม่ต้องการการรักษาเดียวกัน แต่ฉันคิดว่ามันลงไปในการตั้งค่าภูมิภาค


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