我正在编写一个脚本来使用 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% 表示不带毫秒的时间