Date Formatting in a bat file
我的批处理脚本的一部分涉及在批处理文件中创建时间戳。
我使用以下代码以yyyy-mm-dd格式获取日期
set mydate=!date:~10,4!-!date:~4,2!-!date:~7,2!
当我的电脑上的设置是mm-dd-yy并返回date命令时
The current date is: Mon 09/26/2016和我的上述命令将其转换为2016-09-26
但问题是当我在另一台具有dd-mm-yy格式的机器上运行我的脚本时,date命令返回这个:
The current date is: 26-Sep-16和我上面的命令给了我:-ep-16
无论计算机上的日期格式设置如何,我怎么能始终以我想要的格式(yyy-mm-dd)获取日期?
命令wmic os get localdatetime将给出类似的输出
LocalDateTime
20160926085318.630000+120
您可以将输出放在var中或直接将其拆分为多个变量。
对于单行输出,将开关/value添加到上面的命令。 输出将如下所示:
LocalDateTime=20160926085649.867000+120
为了展示功能理念背后的概念,我编写了这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @echo off
setlocal EnableDelayedExpansion
REM change this to what you would do usually in your program:
for /l %%m in (1,1,5) do (
timeout /t 1
call:getNewTimestamp
echo !timestamp!
)
pause
goto:eof
:getNewTimestamp
for /f"delims== tokens=1*" %%g in ('wmic os get localdatetime /value') do (
if".%%g"==".LocalDateTime" (
REM Change this to the usual way to get your timestamp:
set timestamp=%%h
)
)
Goto:eof |
因此,只要您需要当前时间戳,就需要call :getNewTimeStamp。 此功能将!timestamp!设置为所需的值。 然后,您可以像往常一样在程序的主要部分中使用该值。
所以我的例子有一个循环,它经历了5次,每次等待一秒,然后调用getNewTimestamp,然后回显!timestamp!的值。
这里的术语function可能会产生误导。 它从同一个脚本中更新脚本变量,最后的goto:eof与call - 命令一起组合,将导致更新符合"函数脚本"的变量。
-
很酷,谢谢,但我遇到了另一个问题,时间戳和日期在整个日志中保持不变。在批处理文件中发生事件时,我只会看到批处理文件的启动时间和日期,而不是每个%time%和%date%实例。我查了一下[stackoverflow.com/questions/11422182/…但即便是这个解决方案也不适合我。
-
这是我的命令:for /F"usebackq tokens=1,2 delims==" %%i in ( wmic os get LocalDateTime / VALUE 2 ^> NUL ) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j set timestamp=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2%T%ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6% ECHO !timestamp! - SWPath = %SWPATH% >> %SWPATH%
-
示例输出:我在日志中记录的回声几乎没有,但所有回声都有相同的时间示例:2016-09-28T10:00:36.947 - SWPath = C:\SW 2016-09-28T10:00:36.947 - SW Version = 1 2016-09-28T10:00:36.947 - Deleting 2016-09-28T10:00:36.947 - SW Updated 2016-09-28T10:00:36.947 - Done
-
如果在一个paranthesis块中使用该命令,则必须在构建timestamp-> set timestamp=!ldt:~0,4!-!ldt:~4,2!-!ldt:~6,2!T!ldt:~8,2%:!ldt:~??10,2!:!ldt:~12,6!的部分中使用感叹号。如果你还没有这样做,你可以将你得到的代码放在子函数getNewTimestamp或类似的东西中,然后call它可以刷新var timestamp如果你不想使用感叹号。
-
我也试过这个`set timestamp =!ldt:~0,4! - !ldt:~4,2! - !ldt:~6,2!T!ldt:~8,2%:!ldt:? ???? 10,2!:!ldt:~12,6!1但这似乎不起作用,你的子功能想法看起来不错......会给你一个去!谢谢...
-
好吧所以我有点迷失在这里....我确实尝试在子函数"getNewTimestamp"内设置时间戳,但问题是当我试图在我的日志中打印一些东西ECHO !timeStamp! - SW Path = %SW_PATH% >> %SW_PATH%/SW_Log.Log我将如何调用该子函数来自这里?我可以调用它,但它是一个很长的脚本,当我说GOTO getNewTimestamp控件会去那里然后脚本会再次从那个位置开始执行?我正在将内容打印到多个位置的日志中,所以我很困惑如何使用子功能执行此操作?
-
我确实尝试了set timestamp=!ldt:~0,4!-!ldt:~4,2!-!ldt:~6,2! !ldt:~8,2!:!ldt:~10,2!:!ldt:~12,6!,但这也没有用
-
经过一些测试和我自己的观察,我把几行放在一起并提出了一些建议。见上面的编辑;希望能帮助到你 :)
-
谢谢你,将测试它&尽快给您回复。
-
我经历了你的例子,但我的担忧仍然是一样的,这是我的理解,当你第一次建议这个但我的问题是我有一个很长的脚本,如果我们看看你给出的例子,我将如何确保控制会回到通话点吗?例如:`脚本行1,脚本行2,脚本行3 - 调用getnewtimestamp,脚本行4 - 回显时间戳,脚本行5进一步逻辑。现在在第4行,当它调用getnewtimestamp时,控制如何从:getnewtimestamp函数返回到第4行,然后继续执行其他逻辑/行。
-
在上面的例子中,控制如何回到第一个for循环,它回显时间戳?我没有在getnewtimestamp函数中看到任何调用将控件返回到第一个循环?那是我的困惑?我不明白那一部分。
-
我有它的工作,但如果你能帮我理解呼叫功能如何批量工作?在调用之后,它如何知道在批处理脚本中返回的位置?
-
我刚把我的时间戳逻辑放在:getNewTimestamp for /F"usebackq tokens=1,2 delims==" %%i in ( wmic os下得到LocalDateTime / VALUE 2 ^> NUL ) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j set timestamp=!ldt:~0,4!-!ldt:~4,2!-!ldt:~6,2! !ldt:~8,2!:!ldt:~10,2!:!ldt:~12,6!
-
goto和call之间存在重要差异。在上面的示例中,您是否在我的函数末尾看到了goto:eof命令?这基本上标志着功能的结束。在其他编程语言中,当您使用函数时,您不必确定返回的位置,这与批处理相同。它到达文件的末尾(由于命令goto:eof或者因为你的脚本结束),这就是它自动返回到调用它的行。使用goto代替不起作用,因为它不会回来。
-
很酷,明白了!!所以它和任何其他编程语言一样。非常感谢您的解释和坚持不懈的努力。
-
我不确定,我能在多大程度上帮助你,因为我现在使用批量约2个月(不是很有经验),但我会尽我所能。
-
好酷得到它:),即将发送电子邮件!!谢谢
-
@irish看起来像是随机的,想问一下是否应该有邮件......我还没有。
-
嗯好笑!你应该有。让我再发一个。
-
不,没什么。我在我的个人档案中将邮件地址设置为明文。另外,如果有帮助,我添加了我的推特配置文件..