从命令行中的时间值中修剪毫秒

从命令行中的时间值中修剪毫秒

我正在编写一个脚本来使用 RAR 压缩我的文件并使用时间戳命名结果。

我使用TIME环境变量。我也这样做

set _time=%TIME::=.%` 

在文件名中仅使用允许的字符。

我如何摆脱毫秒部分%TIME%,例如16:35:42.07

答案1

只需删除不需要的字符即可:

 set _time=%_time:~0,-3%

或者直接像这样获取完整的、所需的结果:

set _time=%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%

答案2

简单的方法是,如果毫秒字段始终为两位数:%_TIME:~0,-3%
转换为删除前 0 个字符,然后保留最多 (字符串大小 - 3) 个字符。这将.07在您的示例中删除。事实上,这应该始终有效:我刚刚意识到您正在使用内置的 %time% 变量(教我阅读),它应该始终返回两位数的“ms”值。

如果您的毫秒数可能与 不同(例如,0.1不是0.10),则需要某种字符串搜索命令。如下所示:

好吧,这似乎有点儿老套……但这是 Windows 命令行,所以嘿。这将删除点和其后的所有内容,因此无论 ms 值的精度是多少位(例如,0.1而不是0.10),它都可以正常工作。

SetLocal EnableDelayedExpansion

set _time=%time%_EndOfStringMarker
set __DotToEnd=%_time:*.=%
set _time=!_time:%__DotToEnd%=!
set _time=%_time:.=%

EndLocal && set _time=%_time%

确保使用时只有一个点。

现在尝试解释一下。当然,你可以直接使用它,这样就不用费心去理解了。

  • SetLocal 定义了一个本地范围。从现在到 EndLocal 之间发生的任何更改都不会持续到 EndLocal 之后。您不能在 SetLocal 内再进行 SetLocal。
  • EnableDelayedExpansion 允许使用 !s 等。它允许我在变量中使用变量。
  • 我添加了一个 _EndOfStringMarker,所以如果 ms 值(在您的示例中07)出现在其他任何地方,例如秒值,那么它将不会被替换。
  • 我从点之前删除,包括点,只留下点之后的所有内容。命令行不允许我反过来做。
  • 我将原始字符串中点后面的所有内容替换为空,只留下以点结尾的时间。
  • 我将这个点替换为空。
  • 我结束了本地区域,以便稍微整理一下。为了将新的时间值保留在此本地范围之外,我必须在同一行上将其设置为自身。这是命令行的另一个怪癖。

结束不合理修剪的来源:http://ss64.com/nt/syntax-replace.html

答案3

您可以使用变量语法:

@echo off
set hrs=%time:~0,2%
set mns=%time:~3,2%
set scs=%time:~6,2%
set mls=%time:~9,2%
set nmt=%time:~0,8%

使用 %hrs% 表示小时数

使用 %mns% 表示分钟

使用 %scs% 表示秒数

使用 %mls% 表示毫秒

使用 %nmt% 表示不带毫秒的时间

相关内容