For loop 如果使用%time%,则无法在批处理中创建变量逗号

For loop 如果使用%time%,则无法在批处理中创建变量逗号,for-loop,batch-file,variables,regional,For Loop,Batch File,Variables,Regional,我正在编写一个脚本,需要从系统中读取时间,以秒为单位,而不是以毫秒为单位。我注意到一些计算机具有不同的区域设置,这确实导致了一些问题,例如一台计算机的日期显示为01/01/2020,另一台计算机使用命令%date%显示为01.01.2020,等等 同样,如果我使用命令%time%,一些计算机显示的时间类似于12:13:14,15,一些类似于12:13:14.16 现在,为了解决这个问题,我必须创建一个变量来读取分隔符符号并输出正确的符号。对于命令日期,它很简单 现在我有了这个命令: FOR /F

我正在编写一个脚本,需要从系统中读取时间,以秒为单位,而不是以毫秒为单位。我注意到一些计算机具有不同的区域设置,这确实导致了一些问题,例如一台计算机的日期显示为
01/01/2020
,另一台计算机使用命令
%date%
显示为
01.01.2020
,等等

同样,如果我使用命令
%time%
,一些计算机显示的时间类似于
12:13:14,15
,一些类似于
12:13:14.16

现在,为了解决这个问题,我必须创建一个变量来读取分隔符符号并输出正确的符号。对于命令日期,它很简单

现在我有了这个命令:

FOR /F "tokens=3 delims=0123456789" %%A IN ('echo %time%') DO set timeSeparatorSymbol=%%A
如果计算机的毫秒分隔符符号为
,则输出为:

timeSeparatorSymbol=.
timeSeparatorSymbol=
这很好

如果计算机的毫秒分隔符符号为
,则输出为:

timeSeparatorSymbol=.
timeSeparatorSymbol=
正如您所看到的,变量并没有被创建,我正在努力弄清楚为什么逗号不接受它作为变量

我需要此脚本才能使以下脚本适用于所有计算机,无论区域设置如何:

for /f "tokens=3 delims=:%timeSeparatorSymbol%" %%A in ('echo %time%') do set second=%%A

提前感谢。

如果您搜索了此网站,您会发现大量的问题和答案需要以一致的格式返回日期和/或时间

下面的方法显示了一种以
hh:mm:ss
格式获取当前时间的方法,它使用
robocy.exe
作为链接:

@Set“时间戳=”
@对于/F“令牌=2”%%A(
“^”“%\uuuu AppDir\uuu%Robocopy.exe”/NJH/L”\\124;“Null^”
)Do@If-Not Defined TimeStamp Set“TimeStamp=%%A”
@Echo=%TimeStamp%
@超时5
如果你不想让强健变得“复杂”,请尝试以下方法:

For/F“Tokens=2”%%A In('RoboCopy/NJH/L“\\\\\\|“Null^ Find”:“')是否设置“TimeStamp=%%A”

如果您只想检索秒数,即
ss
,(您的问题不清楚):

@Set“Seconds=”
@对于/F“Tokens=4Delims=:”%%A In(
“^”“%\uuuu AppDir\uuu%Robocopy.exe”/NJH/L”\\124;“Null^”
)如果未定义秒数,则不设置“秒数=%%A”
@回声=%s%
@超时5
…再一次没有“复杂化”:

For/F“Tokens=4Delims=:”%%A In('RoboCopy/NJH/L“\\\124;”Null^ Find:“')是否设置“Seconds=%%A”

重新阅读您的问题后,根据我的解释,您唯一的问题是秒和毫秒之间的分隔符类型不同,它们总是
,我将提供以下替代方案:

For/F“Tokens=3 Delims=:”%A In(“%TIME:,=。%”)设置“second=%%~nA”
如果您希望时间戳作为hms,那么这可能就足够了:

对于%%A In(“%TIME:,=.%”)设置“TimeStamp=%%~nA”

如果您只想确保
%TIME%
始终使用
而不是
只需像这样直接使用变量:
%TIME:,=.%

您的问题有很大的推测和解释空间

据我所知,您需要使用日期/时间分隔符来构建有效的日期/时间字符串

您声称格式总是
hh:mm:ss?xx
,因此您可以使用以下命令轻松提取所需的分隔符(
):

同样适用于
date
您声称的“始终
DD?MM?YYYY
):


当然,当日期格式与您的声明不同时(例如
Mon,27.01.2020
%date:~-5,1%
不起作用,只要日期字符串以4位年份结尾,并且之前有分隔符)

我建议使用
for/F“tokens=3 delims=0123456789”%%I IN(“%time%”中的“%DO echo set”timeSeparatorSymbol=%%I“
这要快得多,因为没有用
%ComSpec%/c
echo 11:59:20,15
作为附加参数在后台启动,并在启动
cmd.exe
终止后捕获输出和处理。双引号参数字符串外的逗号被
cmd.exe
解释为参数分隔符,因此被空格字符替换。因此,在单独的cmd进程中执行的是
echo 11:59:20 15
。您知道依赖于区域的日期格式可以不包含或包含缩写的工作日和逗号,并且日期本身可以是格式
dd.MM.yyyyy
dd/MM/yyyyy
MM/dd/yyyyyy
?在使用区域相关日期/时间确定第一个是月,第二个是天,还是第一个是天,第二个是月时,祝您好运。另请参阅维基百科关于的文章。另请参阅和。我建议使用带有
wmic
的区域独立解决方案以毫秒为单位获取日期和时间,尽管打印结果之前
wmic
需要很长时间。如果使用
%SystemRoot%\System32\robocy.exe是可能的,即批处理文件不能支持Windows XP或更旧版本的Windows(默认情况下,robocy.exe不可用)。
robocopy
解决方案比正确编码的
wmic
解决方案快。@Mofi非常简单,只将“echo%time%”替换为“%time%”。我怎么没想到!非常感谢。是的,我知道不同国家的格式日期可能不同,但事实并非如此,这里所有的计算机都有DD/MM/YYYY,但符号不同。谢谢,但这个解决方案似乎太复杂了@Mofi给出了正确的答案,简单地将“echo%time%”替换为“%time%”,现在一切都按预期进行了。这有什么复杂的@JaJe?我在上面添加了另一个版本,删除了我的