在Windows(Windows XP)批处理脚本中,我需要格式化当前日期和时间,以便以后在文件名中使用等 .
它类似于Stack Overflow问题How to append a date in batch files,但也有时间 .
到目前为止我有这个:
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%
这使:
28/07/2009
8:35:31.01
2009_07_28__ 8_36_01
有没有办法允许%TIME%的单个数字小时,所以我可以得到以下内容?
2009_07_28__08_36_01
30 回答
我最终得到了这个脚本:
::在WIN2008R2上,例如我需要让你的'set month =%date:~3,2%'如下所示::否则00为MONTH出现
以下是我生成日志文件名的方法(基于http://ss64.com/nt/syntax-getdate.html):
如果安装了PowerShell,那么您可以轻松可靠地以您想要的任何格式获取日期/时间,例如:
当然,现在总是安装PowerShell,但是在Windows XP上,如果您的批处理脚本在知道PS可用的已知环境中使用(或者如果PowerShell可用,则检查批处理文件),您可能只想使用此技术 . ...)
您可以合理地问:如果您可以使用PowerShell来获取日期/时间,为什么要使用批处理文件,但我认为一些明显的原因是:(a)您不熟悉PowerShell并且仍然喜欢做大多数使用批处理文件的老式方法或(b)您正在更新旧脚本并且不希望将整个内容移植到PS .
每当我需要日期/时间字符串时,我通常会这样做:
这是德国日期/时间格式(dd.mm.yyyy hh:mm:ss) . 基本上我连接子串并最终用零替换所有空格 .
简短解释子串如何工作:
因此,从“29.03.2018”之类的日期开始,只需使用:
我今天遇到了这个问题并解决了它:
它用0替换空格,基本上是零填充小时 .
经过一些快速搜索后,我没有发现它是否需要命令扩展(仍然使用SETLOCAL DISABLEEXTENSIONS) .
如前所述,解析日期和时间仅在您知道当前用户使用的格式时才有用(例如,MM / dd / yy或dd-MM-yyyy仅命名为2) . 这可以确定,但是当你进行所有压力和解析时,你仍然会遇到一些使用了意外格式的情况,并且需要进行更多调整 .
您还可以使用一些外部程序,它将以您的首选格式返回日期slug,但这样做的缺点是需要使用您的脚本/批处理分发实用程序 .
还有一些以非常原始的方式使用CMOS时钟的批处理技巧,但对于大多数人来说,它太接近于裸线,并且也不总是检索日期/时间的首选位置 .
以下是避免上述问题的解决方案 . 是的,它引入了一些其他问题,但出于我的目的,我发现这是在现代Windows系统的.bat文件中创建日期戳的最简单,最清晰,最便携的解决方案 . 这只是一个例子,但我想你会看到如何修改其他日期和/或时间格式等 .
以下可能不是一个直接的答案,而是一个接近的答案?
至少它可能是鼓舞人心的 .
如果您不完全需要这种格式:
然后你可以使用以下使用%date%和%time%的 3 lines of code :
注意:字符
/
和:
将被删除,字符.
和空格将替换为下划线 .示例输出(2015年5月8日星期三下午12:49,50秒和93毫秒):
Windows中的 SET 命令支持的
offset:length
格式不允许您填充 0 ,因为您似乎对此感兴趣 .但是,您可以编写BATCH脚本以检查小于
10
的小时用相应的
echo
字符串填充 .你会发现一些information on the SET command on this link .
你也可以改用其他编程方法来到这里 .
unix bash(Windows上的Cygwin提供)非常简单,只是说,
而且,它总是正确填充 .
我是这样做的:
要生成
YYYY-MM-DD hh:mm:ss
(24小时)时间戳,我使用:第一行始终以这种格式输出时区:
20150515150941.077000 120
这样您只需格式化输出即可满足您的愿望 .
创建一个名为“search_files.bat”的文件,并将下面的内容放入文件中 . 然后双击它 . 临时%THH%变量用于适当处理AM . 如果当前的前2位数字中有0,则Windows将忽略LOG文件的其余文件名 .
这个批处理脚本将完全符合O.P.的要求(在Windows XP SP3上测试) .
我还使用了之前由"jph"描述的聪明的注册表技巧,其中恕我直言,这是在任何新旧系统上将日期100%一致格式化为
"yyyy_MM_dd"
的最简单方法 . 为执行此操作而更改为一个注册表值是暂时的,无关紧要的;它只会持续几毫秒才能立即恢复 .双击此批处理文件进行即时演示,将弹出命令提示符窗口并显示您的时间戳 . . . . .
此bat文件(另存为datetimestr.bat)生成日期时间字符串3次:(1)长日期时间字符串,星期几和秒,(2)短日期时间字符串,不带它们,(3)短代码 .
为了给予适当的信任,我合并了Peter Mortensen(2014年6月18日21:02)和opello(2011年8月25日14:27)的概念 .
你可以写得更短,但是这个长版本使得阅读和理解代码变得容易 .
我喜欢@The lorax上的短版本,但对于其他语言设置,它可能会略有不同 .
例如,在德语设置中(使用自然日期格式:dd.mm.yyyy),月份查询必须从4,2更改为3,2:
我'm really new to batch files and this is my code!! (I am not sure why, but I couldn' t将 date /t 和 time /t 组合在一起,我不能直接使用 %date% 和 %time% 而没有变量...)
它是从其他人那里重用的(问题是要将格式化的时间日期用作文件名) .
这是
datetime string
的2美分 . 在MM DD YYYY
系统上,切换第一个和第二个%DATE:~
条目 .我尝试了接受的答案,效果很好 . 不幸的是,美国时间格式似乎是H:MM:SS.CS,前面缺少的0导致解决问题在上午10点之前 . 为了克服这个障碍并且还允许解析大多数世界时间格式,我想出了这个看起来效果很好的简单例程 .
这个例程的好处是你将时间字符串作为第一个参数和要包含时间(以厘秒为单位)的环境变量的名称作为第二个参数传递 . 例如:
(克里斯)
也许是这样的:
还有另一种简单的方法:
对于在文件名中使用的数字日期的简单解决方案,请使用以下代码:
用斜杠拆分date命令的结果,然后可以将每个标记移动到适当的变量中 .
使用REG保存/修改/恢复对bat文件最有用的值 . 这是Windows 7,对于其他版本,您可能需要不同的密钥名称 .
在这种情况下使用简单的标准编程方法:只需保存当前配置,将其重置为已知状态,提取信息然后恢复原始状态,而不是花费大量精力解析未知实体 . 仅使用标准Windows资源 .
具体来说,日期和时间格式存储在[MS定义]“值”:“sTimeFormat”和“sShortDate”中的注册表项HKCU \ Control Panel \ International \下 . Reg是所有Windows版本附带的控制台注册表编辑器 . 修改HKCU密钥不需要提升权限
简单,直接,适用于所有地区 .
由于我不明白的原因,重置"sShortDate"值会立即在控制台窗口中生效,但重置非常相似的"sTimeFormat"值在新的控制台窗口打开之前不会生效 . 但是,唯一可以改变的是分隔符 - 数字位置是固定的 . 同样,"HH"时间标记应该在前置零之前,但它不会 . 幸运的是,解决方法很简单 .
使用%,您将在时间遇到十六进制操作错误 Value 是7-9 . 要避免这种情况,请使用 DelayedExpansion 并使用!min:~1获取时间值!
另一种方法,如果你有 PowerShell 则调用: