使用分隔符进行批处理文件编程

时间:2015-10-21 21:17:03

标签: batch-file

以下代码给出了预期的输出。

20152210
0242 AM

代码是:

@echo off

for /f "tokens=2,3,4 delims=/ " %%i in ('date /t') do set DATE=%%k%%j%%i
for /f "tokens=1,2,3 delims=:." %%i in ('time /t') do set TIME=%%i%%j%%k

echo %DATE%
echo %TIME%

我不理解部分delims=/ "delims=:.",其中两个字符用作分隔符,而分隔符又提供了正确的输出。

有人可以向我解释部分delims=/ "delims=:."吗?

2 个答案:

答案 0 :(得分:0)

delims命令可以使用多个字符,例如,' abcd + efg + hijk; lmno; pqr'可以使用" delims =; +"分解(来自here)所以这里可以使用这两个字符,当它们到达时。不同部分中的一个或另一个。例如,时间可以写成22:03.30或22.03:30,它们可以工作。空格和斜线与日期,和:或。随着时间的推移。

正如评论所暗示的那样,最好将非系统变量用于您自己的代码:

@echo off

for /f "tokens=2,3,4 delims=/ " %%i in ('date /t') do set MYDATE=%%k%%j%%i
for /f "tokens=1,2,3 delims=:." %%i in ('time /t') do set MYTIME=%%i%%j%%k

echo %MYDATE%
echo %MYTIME%

答案 1 :(得分:0)

这里的关键是理解for命令的某种神秘语法。如果您要编写大量批处理文件,请习惯于for查看for /?命令的帮助。肆意滥用for命令是你如何通过批处理完成很多事情。

所以,让我们看看第一个命令:

for /f "tokens=2,3,4 delims=/ " %%i in ('date /t') do set MyDATE=%%k%%j%%i

我将介绍delims选项。此选项指定要在命令'date /t'中指定的值中查找的分隔符。换句话说,就是你如何告诉for命令令牌所在的位置。请注意,它位于选项列表的末尾?这看起来很奇怪,但实际上很重要。由于允许分隔符为空格字符,因此您将其放在选项列表的末尾。这样,它不是模棱两可的。所以,这里的分隔符是空格()和正斜杠(/)。

date /t的输出如下:

Wed 10/21/2015

[请注意,我使用的是美国英语区域,所以我的日期是M / D / Y格式。]

delims选项在任何分隔符上分割输出。每个生成的“标记”都分配给一个变量,该变量以您在for命令中指定的变量开头。您在此处指定了%%i,因此第一个标记为%%i,然后是%%j,依此类推。如果你指定了这个:

for /f "tokens=2,3,4 delims=/ " %%a ....

然后代币将以%%a开头,然后是%%b等。

tokens=2,3,4部分告诉for命令将哪些标记分配给变量。这将使for命令实际分配变量。

因此,对于我们这里的命令,令牌是这样的:

Token | Value | Variable
------|-------|---------
   1  |   Wed |  None
   2  |    10 |  %%i
   3  |    21 |  %%j
   4  |  2015 |  %%k

请注意,分隔符不会出现在输出中!

这使命令的do部分改变了:

set MyDATE=%%k%%j%%i

对此:

set MyDATE=20152110

现在,我不知道为什么你想要Y / D / M格式的日期,但我假设你的区域使用D / M / Y而你正在转换为Y / M / D.

编辑以添加:

您声明此代码,删除空格:

@echo off 
for /f "tokens=2,3,4 delims=/" %%i in ('date /t') do set MyDATE=%%k%%j%%i 
echo %MYDATE% 
pause 

生成此输出:

2015 28

答案是,没有空格,第一个标记变为Wed 28。但是,您还告诉for命令tokens=2,3,4,因此您希望%%i成为第二个令牌,%%j成为第三个令牌,%%k成为第四个令牌。这意味着你的表看起来像这样:

Token | Value  | Variable
------|--------|---------
   1  | Wed 10 |  None
   2  |     28 |  %%i
   3  |  2015  |  %%j
   4  |        |  %%k

请注意,%%j获取值2015,并在其末尾添加空格。那是因为date /t的输出方式。无论出于何种原因,它在一年后都有一个尾随空格。运行此命令可以更清楚地看到:

@echo off
for /f "tokens=2,3,4 delims=/" %%i in ('date /t') do (
    echo "%%i"
    echo "%%j"
    echo "%%k"
)

生成此输出(再次,美国英语,因此日期为m / d / y):

"27"
"2015 "
""

另请注意,没有令牌4.当/是分隔符时,Wed 10/28/2015中只有两个分隔符,因此令牌4为空值。您仍然可以for分配它,但它不是特别有用。