lau*_*rie 178 windows formatting datetime batch-file
在Windows(Windows XP)批处理脚本中,我需要格式化当前日期和时间,以便以后在文件名中使用等.
它类似于Stack Overflow问题如何在批处理文件中附加日期,但也有时间.
到目前为止我有这个:
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%
Run Code Online (Sandbox Code Playgroud)
这使:
28/07/2009
8:35:31.01
2009_07_28__ 8_36_01
Run Code Online (Sandbox Code Playgroud)
有没有办法允许%TIME%的单个数字小时,所以我可以得到以下内容?
2009_07_28__08_36_01
Run Code Online (Sandbox Code Playgroud)
lau*_*rie 141
我最终得到了这个脚本:
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%
Run Code Online (Sandbox Code Playgroud)
::在WIN2008R2上,例如我需要让你的'set month =%date:~3,2%'如下所示::否则00为MONTH出现
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%
Run Code Online (Sandbox Code Playgroud)
小智 70
@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
Run Code Online (Sandbox Code Playgroud)
nig*_*der 63
以下是我生成日志文件名的方法(基于http://ss64.com/nt/syntax-getdate.html):
@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
...
Run Code Online (Sandbox Code Playgroud)
And*_*eas 42
每当我需要日期/时间字符串时,我通常会这样做:
set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
set dt=%dt: =0%
Run Code Online (Sandbox Code Playgroud)
这是德国日期/时间格式(dd.mm.yyyy hh:mm:ss).基本上我连接子串并最终用零替换所有空格.
简短解释子串如何工作:
%VARIABLE:~num_chars_to_skip,num_chars_to_keep%
Run Code Online (Sandbox Code Playgroud)
因此,从"29.03.2018"之类的日期开始,只需使用:
%DATE:~6,4%
^-----skip 6 characters
^---keep 4 characters
Run Code Online (Sandbox Code Playgroud)
G. *_*ard 38
如果安装了PowerShell,那么您可以轻松可靠地以您想要的任何格式获取日期/时间,例如:
for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a
move "%oldfile%" "backup-%datetime%"
Run Code Online (Sandbox Code Playgroud)
当然,现在总是安装PowerShell,但是在Windows XP上,如果您的批处理脚本在知道PS可用的已知环境中使用(或者如果PowerShell可用,则检查批处理文件),您可能只想使用此技术. ...)
您可以合理地问:如果您可以使用PowerShell来获取日期/时间,为什么要使用批处理文件,但我认为一些明显的原因是:(a)您不熟悉PowerShell并且仍然喜欢做大多数使用批处理文件的老式方法或(b)您正在更新旧脚本并且不希望将整个内容移植到PS.
ope*_*llo 30
我今天遇到了这个问题并解决了它:
SET LOGTIME=%TIME: =0%
Run Code Online (Sandbox Code Playgroud)
它用0替换空格,基本上是零填充小时.
经过一些快速搜索后,我没有发现它是否需要命令扩展(仍然使用SETLOCAL DISABLEEXTENSIONS).
小智 20
如前所述,解析日期和时间仅在您知道当前用户使用的格式时才有用(例如,MM/dd/yy或dd-MM-yyyy仅命名为2).这可以确定,但是当你进行所有压力和解析时,你仍然会遇到一些使用了意外格式的情况,并且需要进行更多调整.
您还可以使用一些外部程序,它将以您的首选格式返回日期slug,但这样做的缺点是需要使用您的脚本/批处理分发实用程序.
还有一些以非常原始的方式使用CMOS时钟的批处理技巧,但对于大多数人来说,它太接近于裸线,并且也不总是检索日期/时间的首选位置.
以下是避免上述问题的解决方案.是的,它引入了一些其他问题,但出于我的目的,我发现这是在现代Windows系统的.bat文件中创建日期戳的最简单,最清晰,最便携的解决方案.这只是一个例子,但我想你会看到如何修改其他日期和/或时间格式等.
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
Run Code Online (Sandbox Code Playgroud)
以下可能不是一个直接的答案,而是一个接近的答案?
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%
Run Code Online (Sandbox Code Playgroud)
至少它可能是鼓舞人心的.
如果您不完全需要这种格式:
2009_07_28__08_36_01
Run Code Online (Sandbox Code Playgroud)
然后你可以使用以下3行代码,它们使用%date%和%time%:
set mydate=%date:/=%
set mytime=%time::=%
set mytimestamp=%mydate: =_%_%mytime:.=_%
Run Code Online (Sandbox Code Playgroud)
注:字符/和:被删除,字符.和空格替换为下划线.
示例输出(2015年5月8日星期三下午12:49,50秒和93毫秒):
echo %mytimestamp%
Wed_08052015_124950_93
Run Code Online (Sandbox Code Playgroud)
小智 7
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%
Run Code Online (Sandbox Code Playgroud)
我对批处理文件真的很陌生,这是我的代码!!(我不知道为什么,但我不能将date /t和time /t组合在一起,我不能在没有变量的情况下直接使用%date%和%time% ......)
@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT
Run Code Online (Sandbox Code Playgroud)
它是从其他人那里重用的(问题是获取格式化的时间日期以用作文件名)。
我是这样做的:
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%
Run Code Online (Sandbox Code Playgroud)
LogFile201310170928.log
This batch script will do exactly what the O.P. wants (tested on Windows XP SP3).
I also used that clever registry trick described by "jph" previously which IMHO is the simplest way of getting 100% consistent formatting of the date to "yyyy_MM_dd" on any Windows system new or old. The change to one Registry value for doing this is instantaneous temporary and trivial; it only lasts a few milliseconds before it is immediately reverted back.
Double-click this batch file for an instant demo, Command Prompt window will pop up and display your timestamp . . . . .
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 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
Run Code Online (Sandbox Code Playgroud)
::========================================================================
::== 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%
Run Code Online (Sandbox Code Playgroud)
无论时区如何,第一行始终以这种格式输出:
20150515150941.077000+120
这使您只需格式化输出以满足您的愿望。
小智 5
还有另一种简单的方法:
set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)
Run Code Online (Sandbox Code Playgroud)