Windows toplu iş komut dosyasında tarih ve saati biçimlendirme


193

Windows (Windows XP) toplu komut dosyasında, dosya adlarında daha sonra kullanmak için geçerli tarih ve saati biçimlendirmem gerekiyor.

Yığın Taşması sorusuna benzer Toplu iş dosyalarına tarih nasıl eklenir , ancak zaman da dahil.

Şimdiye kadar bu var:

echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%

hangi verir:

28/07/2009
 8:35:31.01
2009_07_28__ 8_36_01

% TIME% içinde tek basamaklı bir saate izin verebileceğim bir yol var mı, böylece aşağıdakileri alabilirim?

2009_07_28__08_36_01



datetimefDeğişkeninizdeki boş alanları değiştirebilir ve onun yerine 0 koyabilirsiniz. Örneğin:SET datetimef=%datetimef: =0%
SebaGra

Yanıtlar:


148

Bu senaryo ile sona erdi:

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%

set year=%date:~-4%
echo year=%year%

:: WIN2008R2'de, örneğin, 'ayarlanan ay =% tarihinizi yapmanız gerekiyordu: ~% 3,2' aşağıdaki gibi :: Aksi takdirde MONTH için 00 görünür

set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%

set datetimef=%year%%month%%day%_%hour%%min%%secs%

echo datetimef=%datetimef%

11
FYI, Windows Server 2003 ve Windows 7'de bana "201200Mo_085806" (doğru yıl ve saat) verdi.
sfuqua

50
Buraya Google'dan gelecek olan biri (benim gibi) için not olarak: Bu yerel ayara bağlıdır, bu nedenle İngilizce olmayan Windows'da çalışmak için ince ayarlar gerekebilir!
PiotrK

Ben bu şekilde yaptım: Time / T> Time.dat set / P ftime = <Time.dat set fDate =% tarih: ~% 6% tarih: ~% 3,2% date: ~% 0,2% ftime: ~% 0,2% ftime: ~% 3,2 echo% fTarih% -> 201310170928
Buz

% Zaman nedir: ~% 0,2: ~,% ​​yapısı hakkında bazı belgeler nerede yapar?
user1605665

6
Bütün bunlar sıradan ip değiştirme ile sadece 2 satırda yapılabilir: stackoverflow.com/a/23558738/1879699
Andreas

71
@ECHO OFF
: Sets the proper date and time stamp with 24Hr Time for log file naming
: convention

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%

PAUSE

2
Windows Server 2003 ve Windows 7'de, bu bana doğru dizeyi verdi. Geçmişte inşa ettiğimden çok daha zarif, bu yüzden teşekkür ederim!
sfuqua

3
İşte bana Rus yerel ayarıyla Windows 7'de ne veriyor. Şuanki Zaman: 2013-05-03T02: 22: 51, ancak senaryo yazdırıyor: "2013-5.-01_02_22_51"
nightcoder

7
% Date%, farklı yerel ayarlara sahip farklı bir dize verecektir.
AechoLiu

2
döndürür bana (çek yerel) için 20146.0._173502
Muflix

2
win7 64bit nihai, yanlış zaman: 20140.01_131612, olmalıdır (2014.10.26_131612)
waza123

66

Nasıl bir günlük dosya adı ( http://ss64.com/nt/syntax-getdate.html dayalı ) oluşturmak:

@ECHO OFF
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error

:: Use WMIC to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
   IF "%%~L"=="" goto s_done
      Set _yyyy=%%L
      Set _mm=00%%J
      Set _dd=00%%G
      Set _hour=00%%H
      SET _minute=00%%I
      SET _second=00%%K
)
:s_done

:: Pad digits with leading zeros
      Set _mm=%_mm:~-2%
      Set _dd=%_dd:~-2%
      Set _hour=%_hour:~-2%
      Set _minute=%_minute:~-2%
      Set _second=%_second:~-2%

Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second%
goto make_dump

:s_error
echo WMIC is not available, using default log filename
Set logtimestamp=_

:make_dump
set FILENAME=database_dump_%logtimestamp%.sql
...

5
toplu olarak yerelden bağımsız zaman damgası üretimi hakkında sorular için SO üzerinde en iyi cevap.
Mike Campbell

2
Müthiş! Bunu çözüm olarak işaretlemenin bir yolu olmalı
Rado

49

Ne zaman bir tarih / saat dizesi gerektiğinde genellikle bu şekilde yaparım:

set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
set dt=%dt: =0%

Bu, Alman tarih / saat formatı içindir (gg.aa.yyyy ss: dd: ss). Temelde alt dizeleri birleştirmek ve sonunda tüm boşlukları sıfırlar ile değiştirin.

Alt dizelerin nasıl çalıştığına dair kısa açıklama:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

Yani "29.03.2018" gibi bir tarihten sadece yılı almak için:

%DATE:~6,4%
       ^-----skip 6 characters
         ^---keep 4 characters 

7
temiz bir zaman damgası (boşluk veya başka bir karakter) ihtiyacınız olduğunda bugüne kadar en şık çözüm
jvdneste

1
@Jvdneste ile daha fazla anlaşamazdım mrt paylaştığınız için teşekkürler
this.user3272243

1
kesinlikle harika - ve çalışıyor [gerekli sözdizimi çok kafa karıştırıcı, ancak posterin sorunu bu değil]
JosephDoggie

38

PowerShell yüklüyse, Tarih / Saati istediğiniz formatta kolayca ve güvenilir bir şekilde alabilirsiniz, örneğin:

for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a
move "%oldfile%" "backup-%datetime%"

Elbette günümüzde PowerShell her zaman yüklüdür, ancak Windows XP'de bu tekniği sadece toplu komut dosyanız PS'nin mevcut olduğunu bildiğiniz bilinen bir ortamda kullanılıyorsa (veya PowerShell mevcutsa toplu iş dosyanızı kontrol edin) ...)

Makul bir şekilde sorabilirsiniz: Tarih / saati almak için PowerShell'i kullanabiliyorsanız neden bir toplu iş dosyası kullanıyorsunuz, ancak bence bazı açık nedenler şunlardır: toplu iş dosyaları ile eski moda bir şekilde işler veya (b) eski bir komut dosyasını güncelliyor ve her şeyi PS'ye taşımak istemiyorsunuz.


(a) benim durumumda ve bu mükemmel çalışıyor (yarasa sadece çevrem için ama farklı parçalar üzerinde karışık yerel ayarlara sahibim). Teşekkür ederim!
ccalboni

30

Bugün bu problemle karşılaştım ve çözdüm:

SET LOGTIME=%TIME: =0%

Boşlukları 0s ile değiştirir ve temelde saati sıfır pedi yapar.

Bazı hızlı aramalardan sonra komut uzantıları (hala SETLOCAL DISABLEEXTENSIONS ile çalıştı) gerekli olup olmadığını bulamadım.


Tamam, değişkenlerde ikame. Şimdi - iki nokta üst üste ( :) nasıl kullanılır?
Tomasz Gandor

@TomaszGandor Bu benim için çalışıyor: echo %TIME: =:%ama belki :bir ^benzeri ile kaçmayı deneyin echo %TIME: =^:%(ki benim için de çalışır).
opello

1
Basitlik için +1. Sütunlar dosya adlarında geçerli değil. set theTime =% Zaman :: =% bunları siler. Boşluk için 0 yerine, iki nokta üst üste işaretini silebilir ve tek bir ifadede 6 karaktere (böylece ondalık bölümü silerek) kesebilir misiniz? İki veya üç satır alırsa bu kadar büyük bir anlaşma değil. Ben sadece merak ediyorum.
riderBill

Bildiğimden değil. Eğer bulursanız lütfen takip edin!
opello

21

Daha önce de belirtildiği gibi, tarih ve saati ayrıştırmak yalnızca geçerli kullanıcı tarafından kullanılan formatı biliyorsanız (örneğin, yalnızca iki ad vermek için AA / gg / yy veya gg-AA-yyyy) faydalıdır. Bu belirlenebilir, ancak tüm stres ve ayrışmayı yaptığınız zaman, yine de beklenmedik bir biçimin kullanıldığı bir durumla karşılaşırsınız ve daha fazla ince ayar gerekli olacaktır.

Ayrıca, bir tarih bilgisini tercih ettiğiniz biçimde döndürecek, ancak yardımcı programın komut dosyanızla / toplu işinizle dağıtılması gerektiğinde dezavantajları olan bazı harici programları da kullanabilirsiniz.

CMOS saatini oldukça ham bir şekilde kullanan toplu numaralar da vardır, ancak bu çoğu insan için çıplak kablolara yakındır ve ayrıca tarih / saati almak için her zaman tercih edilen yer değildir.

Aşağıda yukarıdaki sorunları önleyen bir çözüm bulunmaktadır. Evet, başka bazı sorunlar getiriyor, ancak benim amacım için bunu, modern Windows sistemleri için .bat dosyalarında bir tarih damgası oluşturmak için en kolay, en açık, en taşınabilir çözüm olarak buldum. Bu sadece bir örnektir, ancak diğer tarih ve / veya saat biçimleri vb. İçin nasıl değiştirileceğini göreceğinizi düşünüyorum.

reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f
@REM reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f

3
Tam da aradığım şey. Her yerel ayarda çalışan bir şey. Teşekkürler!
Lost_DM

"Modern Windows sistemleri" için +1 ile başa çıkmak :) Şaka bir yana, bu çok ustaca, ve dediğin gibi, taşınabilir, sorunla başa çıkmak için bir yol.
Zach Young

9
Bu korkunç bir çözüm. Başarısız olursa, genel bir ayar kalıcı olarak değiştirilir. Ayrıca diğer uygulamalarla yarış koşullarını tanıtır.
MikeKulls

reg query "HKCU\Control Panel\International" /v sShortDateKayıt defteri ayarını değiştirmeden parçayı kullanabilirsiniz (okuyucuya kalan egzersiz!).
tricasse

9

Aşağıdakiler doğrudan bir cevap değil, yakın bir cevap olabilir mi?

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2%
else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%

En azından ilham verici olabilir.


9

Tam olarak bu biçime ihtiyacınız yoksa:

2009_07_28__08_36_01

Ardından ,% date% ve% time% kullanan aşağıdaki 3 kod satırını kullanabilirsiniz :

set mydate=%date:/=%
set mytime=%time::=%
set mytimestamp=%mydate: =_%_%mytime:.=_%

Not: /ve karakterleri :kaldırılır ve karakter. ve boşluk bir alt çizgiyle değiştirilir.

Örnek çıktı (8/5/15 Çarşamba, 12:49 PM'de 50 saniye ve 93 milisaniye ile alınmıştır):

echo %mytimestamp%
Wed_08052015_124950_93

saat 12'den küçük olduğunda, ayar günüm =% tarih: / =% ayarlanan zamanım =% zaman :: =% ayarlanan zamanım =% zamanım: =% 0 ayarlanan zamanim =% günim: = _% _% zamanım:. = _ %
ragche

8
REM Assumes UK style date format for date environment variable (DD/MM/YYYY).
REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero.
REM If first character of time is a space (less than 1) then set DATETIME to:
REM YYYY-MM-DD-0h-mm-ss
REM Otherwise, set DATETIME to:
REM YYYY-MM-DD-HH-mm-ss
REM Year, month, day format provides better filename sorting (otherwise, days grouped
REM together when sorted alphabetically).

IF "%time:~0,1%" LSS "1" (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2%
) ELSE (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
)

ECHO %DATETIME%

6

offset:lengthİle desteklenen biçimlendirme SETped sizi izin vermez Windows komuta 0sen ilgilenen gibi görünüyor olarak.

Bununla birlikte, bir BATCH betiğini saatin altında olup olmadığını kontrol etmek için kodlayabilir 10ve
buna göre farklı bir echodizeyle ped yapabilirsiniz .

Bu bağlantıdaki komut hakkında bazı bilgilerSET bulacaksınız .


Buraya ulaşmak için diğer programlama yöntemlerine de geçebilirsiniz.

Unix bash'da (Windows'da Cygwin ile kullanılabilir) söylemek oldukça basittir,

date +%Y_%m_%d__%H_%M_%S

Ve her zaman doğru bir şekilde doluyor.


6

Bu şekilde yaptım:

REM Generate FileName from date and time in format YYYYMMTTHHMM

Time /T > Time.dat
set /P ftime= < Time.dat

set FileName=LogFile%date:~6%%date:~3,2%%date:~0,2%%ftime:~0,2%%ftime:~3,2%.log

echo %FileName%

LogFile201310170928.log


İngilizce sunucu üzerinde çalışır (İşletim Sistemi Adı: Microsoft (R) Windows (R) Server 2003 Standard x64 Edition, İşletim Sistemi Sürümü: 5.2.3790 Service Pack 2 Build 3790)
Buz

1
ve ayrıca Alman sunucusunda da test edildi (Betriebssystemname: Microsoft® Windows Server® 2008 Enterprise, Betriebssystemversion: 6.0.6002 Service Pack 2 Build 6002)
Buz

1
Hatta bu bile Tamam: (Betriebssystemname: Microsoft Windows Server 2012 Standard, Betriebssystemversion: 6.2.9200 Nicht zutreffend Build 9200)
Buz

4
::========================================================================  
::== CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS   
::======= ================================================================  
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a  
SET DATETIME=%DTS:~0,8%-%DTS:~8,6%  

İlk satır her zaman saat dilimi bakımından bu biçimde çıkar:
20150515150941.077000 + 120
Bu, çıktıyı isteklerinize göre biçimlendirmenizi sağlar.


4

Bu yarasa dosyası (datetimestr.bat olarak kaydet) datetime dizesini 3 kez üretir: (1) haftanın günü ve saniye olan uzun datetime dizesi, (2) onlarsız kısa datetime dizesi ve (3) kodun kısa versiyonu.

@echo off
REM "%date: =0%" replaces spaces with zeros
set d=%date: =0%
REM "set yyyy=%d:~-4%" pulls the last 4 characters
set yyyy=%d:~-4%
set mm=%d:~4,2%
set dd=%d:~7,2%
set dow=%d:~0,3%
set d=%yyyy%-%mm%-%dd%_%dow%

set t=%TIME: =0%
REM "%t::=%" removes semi-colons
REM Instead of above, you could use "%t::=-%" to 
REM replace semi-colons with hyphens (or any 
REM non-special character)
set t=%t::=%
set t=%t:.=%

set datetimestr=%d%_%t%
@echo  Long date time str = %datetimestr%

set d=%d:~0,10%
set t=%t:~0,4%
set datetimestr=%d%_%t%
@echo Short date time str = %datetimestr%


@REM Short version of the code above
set d=%date: =0%
set t=%TIME: =0%
set datetimestr=%d:~-4%-%d:~4,2%-%d:~7,2%_%d:~0,3%_%t:~0,2%%t:~3,2%%t:~6,2%%t:~9,2%
@echo Datetimestr = %datetimestr%

pause

Doğru kredi vermek için, kavramları Peter Mortensen (Haziran 18 '14 21:02) ve opello (25 Ağustos 11: 14:27) ile birleştirdim.

Bunu çok daha kısa yazabilirsiniz, ancak bu uzun sürüm kodu okumayı ve anlamayı kolaylaştırır.


4

Dosyaları toplu olarak gerçekten yeniyim ve bu benim kodum !! (Neden olduğundan emin değilim, ancak date / t ile time / t'yi bir araya getiremedim ve % date% ve % time% değişkenini doğrudan bir değişken olmadan kullanamadım ...)

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT

Bu, başkalarından yeniden kullanılmış (soru, dosya adı olarak kullanmak için biçimlendirilmiş bir zaman çizelgesi almaktı).


4

Bunu yapmanın başka bir kolay yolu daha var:

set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)

3

Bir oluşturmak için YYYY-MM-DD hh:mm:ss(24 saat) zaman damgası I kullanımı:

SET CURRENTTIME=%TIME%
IF "%CURRENTTIME:~0,1%"==" " (SET CURRENTTIME=0%CURRENTTIME:~1%)
FOR /F "tokens=2-4 delims=/ " %%A IN ('DATE /T') DO (SET TIMESTAMP=%%C-%%A-%%B %CURRENTTIME%)

Belirli bir bölgesel ortam varsayıyor mu?
Peter Mortensen

1
Göre ss64.com/nt/syntax-variables.html%TIME% ve %DATE%değişkenler aynı işlemi TIMEve DATEsırasıyla komutları. Sistemimdeki değişkenler bölgesel ayarlarımla uyuşmuyor.
M Dudley

3

Bu toplu komut dosyası OP'nin tam olarak istediğini yapacak (Windows XP SP3'te test edilmiştir).

Ayrıca daha önce "jph" tarafından açıklanan akıllı kayıt defteri hile kullandım hangi IMHO "yyyy_MM_dd"yeni veya eski herhangi bir Windows sisteminde tarih% 100 tutarlı biçimlendirme elde etmenin en basit yoludur . Bunu yapmak için bir Kayıt Defteri değerinde yapılan değişiklik, geçici ve önemsizdir; hemen geri dönmeden önce yalnızca birkaç milisaniye sürer.

Anında bir demo için bu toplu iş dosyasına çift tıklayın, Komut İstemi penceresi açılır ve zaman damganızı görüntüler. . . . .

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: generates a custom formatted timestamp string using date and time.
:: run this batch file for an instant demo.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@ECHO OFF
SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A

:: --- CHANGE THE COMPUTER DATE FORMAT TEMPORARILY TO MY PREFERENCE "yyyy_MM_dd",
REG COPY "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f 2>nul >nul
REG ADD "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f 2>nul >nul

SET MYDATE=%date%

:: --- REVERT COMPUTER DATE BACK TO SYSTEM PREFERENCE
REG COPY "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f 2>nul >nul
REG DELETE "HKCU\Control Panel\International-Temp" /f 2>nul >nul

:: --- SPLIT THE TIME [HH:MM:SS.SS] TO THREE SEPARATE VARIABLES [HH] [MM] [SS.SS]
FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO (
SET HOUR=%%A
SET MINUTES=%%B
SET SECONDS=%%C
)

:: --- CHOOSE ONE OF THESE TWO OPTIONS :
:: --- FOR 4 DIGIT SECONDS        //REMOVES THE DOT FROM THE SECONDS VARIABLE [SS.SS]
:: SET SECONDS=%SECONDS:.=%
:: --- FOR 2 DIGIT SECONDS        //GETS THE FIRST TWO DIGITS FROM THE SECONDS VARIABLE [SS.SS]
SET SECONDS=%SECONDS:~0,2% 

:: --- FROM 12 AM TO 9 AM, THE HOUR VARIABLE WE EXTRACTED FROM %TIME% RETURNS A SINGLE DIGIT, 
:: --- WE PREFIX A ZERO CHARACTER TO THOSE CASES, SO THAT OUR WANTED TIMESTAMP
:: --- ALWAYS GENERATES DOUBLE-DIGIT HOURS (24-HOUR CLOCK TIME SYSTEM).
IF %HOUR%==0 (SET HOUR=00)
IF %HOUR%==1 (SET HOUR=01)
IF %HOUR%==2 (SET HOUR=02)
IF %HOUR%==3 (SET HOUR=03)
IF %HOUR%==4 (SET HOUR=04)
IF %HOUR%==5 (SET HOUR=05)
IF %HOUR%==6 (SET HOUR=06)
IF %HOUR%==7 (SET HOUR=07)
IF %HOUR%==8 (SET HOUR=08)
IF %HOUR%==9 (SET HOUR=09)

:: --- GENERATE OUR WANTED TIMESTAMP
SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS%

:: --- VIEW THE RESULT IN THE CONSOLE SCREEN
ECHO.
ECHO    Generate a custom formatted timestamp string using date and time.
ECHO.
ECHO    Your timestamp is:    %TIMESTAMP%
ECHO.
ECHO.
ECHO    Job is done. Press any key to exit . . .
PAUSE > NUL

EXIT

Windows 2019'da da çalışır. Çözümünüzü bulacağım, beğendim :)
user225479

Soru, ben sadece gece yarısından sonra, çıkış "0" düştü keşfetti. Neden olduğu hakkında bir fikrin var mı? Senaryonuzla yaptığım çıktı: Zaman damganız: 2019_09_16__0_58_07 ..00_58_07 yerine. Ancak saat 1'den sonra beklendiği gibi çalışır (ve çıktı verir: ..01_01_56).
user225479

ELSE deyimine EĞER% HOUR% == 0 (SET HOUR = 00) ekledim. Bunu düzeltmeli, umarım :)
user225479 16:19

@ User225479 için geri bildiriminiz için teşekkür ederiz. Kodu düzelttim. 24 SAAT biçimine dönüştürülen HOUR değişkeninin tüm olası permütasyonları artık doğru şekilde çalışacaktır. Ayrıca düzeni daha kolay okunacak şekilde değiştirdim.
derty2

2
set hourstr = %time:~0,2%
if "%time:~0,1%"==" " (set hourstr=0%time:~1,1%)
set datetimestr=%date:~0,4%%date:~5,2%%date:~8,2%-%hourstr%%time:~3,2%%time:~6,2%

2

"Search_files.bat" adlı bir dosya oluşturun ve aşağıdaki içeriği dosyaya yerleştirin. Ardından çift tıklayın. Geçici olarak% THH% değişkeni AM'yi uygun şekilde işlemek için yerleştirildi. Zamanın ilk 2 basamağında 0 varsa, Windows LOG dosyasının dosya adının geri kalanını yoksayar.

CD .
SET THH=%time:~0,2%
SET THH=%THH: =0%
dir /s /b *.* > %date:~10,4%-%date:~4,2%-%date:~7,2%@%THH%.%time:~3,2%.%time:~6,2%.LOG

2

Lorax'ın üstündeki kısa versiyonu beğendim, ancak diğer dil ayarları için biraz farklı olabilir.

Örneğin, Almanca dil ayarlarında (doğal tarih biçiminde: gg.aa.yyyy) ay sorgusunun 4,2'den 3,2'ye değiştirilmesi gerekir:

@ECHO OFF
: Sets the proper date and time stamp with 24h time for log file naming convention i.e.

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~3,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~3,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%
: Outputs= 20160727_081040
: (format: YYYYMMDD_HHmmss; e.g.: the date-output of this post timestamp)

PAUSE

1

Bu benim için 2 sent datetime string. Açık MM DD YYYYsistemler, birinci ve ikinci geçiş %DATE:~girişlerini.

    REM ====================================================================================
    REM CREATE UNIQUE DATETIME STRING FOR ADDING TO FILENAME
    REM ====================================================================================
    REM Can handle dd DDxMMxYYYY and DDxMMxYYYY > CREATES YYYYMMDDHHMMSS (x= any character)
    REM ====================================================================================
    REM CHECK for SHORTDATE dd DDxMMxYYYY 
    IF "%DATE:~0,1%" GTR "3" (
        SET DATETIME=%DATE:~9,4%%DATE:~6,2%%DATE:~3,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
    ) ELSE (
    REM ASSUMES SHORTDATE DDxMMxYYYY
        SET DATETIME=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
        )
    REM CORRECT FOR HOURS BELOW 10
    IF %DATETIME:~8,2% LSS 10 SET DATETIME=%DATETIME:~0,8%0%DATETIME:~9,5%
    ECHO %DATETIME%

1

Kabul edilen cevabı denedim ve oldukça iyi çalışıyor. Ne yazık ki ABD Saat Biçimi H: MM: SS.CS gibi görünüyor ve ön taraftaki eksik 0 saat 10'dan önce ayrıştırma sorunlarına neden oluyordu. Bu engelin üstesinden gelmek ve aynı zamanda dünya saatlerinin çoğunun ayrıştırılmasına izin vermek için, oldukça iyi çalıştığı görülen bu basit rutin ile geldim.

:ParseTime
rem The format of %%TIME%% is H:MM:SS.CS or (HH:MM:SS,CS) for example 0:01:23.45 or 23:59:59,99
FOR /F "tokens=1,2,3,4 delims=:.," %%a IN ("%1") DO SET /A "%2=(%%a * 360000) + (%%b * 6000) + (%%c * 100) + %%d"
GOTO :EOF

Bu rutinle ilgili güzel bir şey, zaman dizesini ilk parametre olarak ve saati (santisaniye cinsinden) ikinci parametre olarak içermek istediğiniz ortam değişkeninin adını iletmenizdir. Örneğin:

CALL :ParseTime %START_TIME% START_CS
CALL :ParseTime %TIME% END_CS
SET /A DURATION=%END_CS% - %START_CS%

(* Chris *)


1

Belki böyle bir şey:

@call:DateTime

@for %%? in (
    "Year   :Y"
    "Month  :M"
    "Day    :D"
    "Hour   :H"
    "Minutes:I"
    "Seconds:S"
) do @for /f "tokens=1-2 delims=:" %%# in (%%?) do @for /f "delims=" %%_ in ('echo %%_DT_%%$_%%') do @echo %%# : _DT_%%$_ : %%_

:: OUTPUT
:: Year    : _DT_Y_ : 2014
:: Month   : _DT_M_ : 12
:: Day     : _DT_D_ : 17
:: Hour    : _DT_H_ : 09
:: Minutes : _DT_I_ : 04
:: Seconds : _DT_S_ : 35

@pause>nul

@goto:eof

:DateTime
    @verify errorlevel 2>nul & @wmics Alias /? >nul 2>&1
    @if not errorlevel 1 (
        @for /f "skip=1 tokens=1-6" %%a in ('wmic path win32_localtime get day^,hour^,minute^,month^,second^,year /format:table') do @if not "%%f"=="" ( set "_DT_D_=%%a" & set "_DT_H_=%%b" & set "_DT_I_=%%c" & set "_DT_M_=%%d" & set "_DT_S_=%%e" & set "_DT_Y_=%%f" )
    ) else (
        @set "_DT_T_=1234567890 "
    )
    @if errorlevel 1 (
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "Y" "M" "D" "H" "I" "S") do @set "_DT_%%~?_=%%~?"
        @for %%? in ("Date" "Time") do @for /f "skip=2 tokens=1,3" %%a in ('reg query "HKCU\Control Panel\International" /v ?%%~? 2^>nul') do @for /f %%x in ('echo:%%_DT_%%a_%%') do @if "%%x"=="%%a" set "_DT_%%a_=%%b"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_T_=%%a%%b%%c"
    )
    @if errorlevel 1 (
        @if "%_DT_iDate_%"=="0" (set "_DT_F_=_DT_D_ _DT_Y_ _DT_M_") else if "%_DT_iDate_%"=="1" (set "_DT_F_=_DT_D_ _DT_M_ _DT_Y_") else if "%_DT_iDate_%"=="2" (set "_DT_F_=_DT_Y_ _DT_M_ _DT_D_")
        @for /f "tokens=1-4* delims=%_DT_sDate_%" %%a in ('date/t') do @for /f "tokens=1-3" %%x in ('echo:%%_DT_F_%%') do @set "%%x=%%a" & set "%%y=%%b" & set "%%z=%%c"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_H_=%%a" & set "_DT_I_=%%b" & set "_DT_S_=%%c"
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "T") do @set "_DT_%%~?_="
    )
    @for %%i in ("Y"                ) do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=  0 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-4%%"') do @set "_DT_%%~i_=%%~k"
    @for %%i in ("M" "D" "H" "I" "S") do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=100 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-2%%"') do @set "_DT_%%~i_=%%~k"
@exit/b

1

Bu gibi durumlarda basit, standart bir programlama yaklaşımı kullanın: Bilinmeyen bir varlığı ayrıştırmak için büyük bir çaba harcamak yerine, geçerli yapılandırmayı kaydedin, bilinen bir duruma sıfırlayın, bilgileri çıkarın ve orijinal durumunu geri yükleyin. Yalnızca standart Windows kaynaklarını kullanın.

Özellikle, tarih ve saat biçimleri [MS definition] "değerleri": "sTimeFormat" ve "sShortDate" içindeki HKCU \ Control Panel \ International \ kayıt defteri anahtarında saklanır. Reg, tüm Windows sürümlerinde bulunan konsol kayıt defteri düzenleyicisidir. HKCU anahtarını değiştirmek için yükseltilmiş ayrıcalıklar gerekli değildir

Prompt $N:$D $T$G

::Save current config to a temporary (unique name) subkey, Exit if copy fails
Set DateTime=
Set ran=%Random%
Reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp%ran%" /f
If ErrorLevel 1 GoTO :EOF

::Reset the date format to your desired output format (take effect immediately)
::Resetting the time format is useless as it only affect subsequent console windows
::Reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH_mm_ss"   /f
Reg add "HKCU\Control Panel\International" /v sShortDate  /d "yyyy_MM_dd" /f

::Concatenate the time and (reformatted) date strings, replace any embedded blanks with zeros
Set DateTime=%date%__%time:~0,2%_%time:~3,2%_%time:~6,2%
Set DateTime=%DateTime: =0%

::Restore the original config and delete the temp subkey, Exit if restore fails
Reg copy   "HKCU\Control Panel\International-Temp%ran%" "HKCU\Control Panel\International" /f
If ErrorLevel 1 GoTO :EOF
Reg delete "HKCU\Control Panel\International-Temp%ran%" /f

Basit, basit ve tüm bölgeler için çalışmalıdır.

Anlamadığım nedenlerden ötürü, "sShortDate" değerini sıfırlamak bir konsol penceresinde hemen etkili olur, ancak çok benzer "sTimeFormat" değerini sıfırlamak yeni bir konsol penceresi açılana kadar ETKİNLEŞMEZ . Ancak, değiştirilebilen tek şey sınırlayıcıdır - basamak konumları sabittir. "HH" zaman belirtecinin baştaki sıfırların önüne geçmesi gerekiyor, ancak değil. Neyse ki, geçici çözümler kolaydır.


-1 "Başında sıfır eklemek yerine, neden makine yapılandırmasını bozmuyorsunuz, onu rastgele ihtiyacınıza değiştirmiyorsunuz ve sonra işinizi yapıyorsunuz?" Bu yaklaşım bu dünyanın dışındadır, önemli miktarda çaba gerektirir ve sonsuz sayıda istenmeyen sonuca yol açabilir. Okunabilirlik ve standart beklenen kod davranışı hakkında tartışmaya bile başlamak istemiyorum. şeref.
vaitrafra

sTimeFormatSaat biçimini sıfırlamak işe yaramaz . Hayır! Sonraki konsol istemini etkilediği için şunu kullanarak uygulayınfor /f "delims=" %%G in ('cmd /C echo SET "DateTime=%%date%%__%%time%%"') do %%G
JosefZ

1

Bu komut dosyası, Windows XP Professional'dan bu yana Windows'un ayrılmaz bir parçası olan WMIC aracıyla birincil olarak erişilen bir WMI arabirimi kullanır (Home sürümü de desteklenir, ancak araç varsayılan olarak yüklenmez). Komut dosyası, bir WMI arabirimine erişim için WSH vbscript oluşturup çağırarak ve WMIC aracıyla aynı formatta konsol çıktısı yazarak eksik WMIC aracının bir çözümünü de uygular.

@ECHO OFF
REM Returns: RETURN
REM Modify:  RETURN, StdOut
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond

CALL :getTime %*
ECHO %RETURN%
GOTO :EOF


REM SUBROUTINE
REM Returns: RETURN
REM Modify:  RETURN
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond
:getTime
  SETLOCAL EnableDelayedExpansion
    SET DELIM=-
    WHERE /Q wmic.exe
    IF NOT ERRORLEVEL 1 FOR /F "usebackq skip=1 tokens=*" %%x IN (`wmic.exe os get LocalDateTime`) DO (SET DT=%%x & GOTO getTime_Parse)
    SET _TMP=%TEMP:"=%
    ECHO Wscript.StdOut.WriteLine (GetObject("winmgmts:root\cimv2:Win32_OperatingSystem=@").LocalDateTime)>"%_TMP%\get_time_local-helper.vbs"
    FOR /F "usebackq tokens=*" %%x IN (`cscript //B //NoLogo "%_TMP%\get_time_local-helper.vbs"`) DO (SET DT=%%x & GOTO getTime_Parse)
    :getTime_Parse
      SET _RET=
      IF "%1" EQU "" (
        SET _RET=%DT:~0,4%%DELIM%%DT:~4,2%%DELIM%%DT:~6,2%%DELIM%%DT:~8,2%%DELIM%%DT:~10,2%%DELIM%%DT:~12,2%%DELIM%%DT:~15,3%
      ) ELSE (
        REM Not recognized format strings are ignored during parsing - no error is reported.
       :getTime_ParseLoop
         SET _VAL=
         IF "%1" EQU "YYYY" SET _VAL=%DT:~0,4%
         IF "%1" EQU "MM"   SET _VAL=%DT:~4,2%
         IF "%1" EQU "DD"   SET _VAL=%DT:~6,2%
         IF "%1" EQU "hh"   SET _VAL=%DT:~8,2%
         IF "%1" EQU "mm"   SET _VAL=%DT:~10,2%
         IF "%1" EQU "ss"   SET _VAL=%DT:~12,2%
         IF "%1" EQU "ms"   SET _VAL=%DT:~15,3%
         IF DEFINED _VAL (
           IF DEFINED _RET (
             SET _RET=!_RET!%DELIM%!_VAL!
           ) ELSE (
             SET _RET=!_VAL!
           )
         )
         SHIFT
         IF "%1" NEQ "" GOTO getTime_ParseLoop
      )
  ENDLOCAL & SET RETURN=%_RET%
GOTO :EOF

1

Erken değişken genişlemeyi önlemek için güzel bir tek satır hile kullanmaktır cmd /c echo ^%time^%

cmd /c echo ^%time^% & dir /s somelongcommand & cmd /c echo ^%time^%

0
:: =============================================================
:: Batch file to display Date and Time seprated by undescore.
:: =============================================================
:: Read the system date.
:: =============================================================
@SET MyDate=%DATE%
@SET MyDate=%MyDate:/=:%
@SET MyDate=%MyDate:-=:%
@SET MyDate=%MyDate: =:%
@SET MyDate=%MyDate:\=:%
@SET MyDate=%MyDate::=_%
:: =============================================================
:: Read the system time.
:: =============================================================
@SET MyTime=%TIME%
@SET MyTime=%MyTime: =0%
@SET MyTime=%MyTime:.=:%
@SET MyTime=%MyTime::=_%
:: =============================================================
:: Build the DateTime string.
:: =============================================================
@SET DateTime=%MyDate%_%MyTime%
:: =============================================================
:: Display the Date and Time as it is now.
:: =============================================================
@ECHO MyDate="%MyDate%" MyTime="%MyTime%" DateTime="%DateTime%"
:: =============================================================
:: Wait before close.
:: =============================================================
@PAUSE
:: =============================================================

0

Dosya adlarında kullanılacak sayısal tarih için çok basit bir çözüm için aşağıdaki kodu kullanın:

set month=%date:~4,2%
set day=%date:~7,2%
set curTimestamp=%month%%day%%year%

rem then the you can add a prefix and a file extension easily like this
echo updates%curTimestamp%.txt

0

Tarih komutunun sonuçlarını eğik çizgi ile bölün, ardından jetonların her birini uygun değişkenlere taşıyabilirsiniz.

FOR /F "tokens=1-3 delims=/" %%a IN ("%date:~4%") DO (
SET _Month=%%a
SET _Day=%%b
SET _Year=%%c
)
ECHO Month %_Month%
ECHO Day %_Day%
ECHO Year %_Year%
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.