windows - 为什么 for/f 不忽略空行?

标签 windows batch-file for-loop

我试图从批处理文件中的 for/f 循环中获取一个简单的值。

使用命令 wmic path win32_localtime get dayofweek 给我输出:

C:\sendemail>wmic path win32_localtime get dayofweek
DayOfWeek
1


C:\sendemail>

因此,使用以下批处理脚本,我应该能够返回结果“1”:

set cmd=wmic path win32_localtime get dayofweek
for /f "tokens=1 skip=1" %%Z in ('%cmd%') do set _myday=%%Z
echo Var is %_myday%

但我没有,它至少设置变量两次,如下所示:

C:\sendemail>set cmd=wmic path win32_localtime get dayofweek

C:\sendemail>for /F "tokens=1 skip=1" %Z in ('wmic path win32_localtime get dayofweek') do set _myday=%Z

C:\sendemail>set _myday=1

 :\sendemail>set _myday=

C:\sendemail>echo Var is
Var is

C:\sendemail>

起初,我想知道为什么,然后我意识到循环正在处理这两个空行……这是不应该的。根据这个:http://ss64.com/nt/for_cmd.html

Skip SKIP will skip processing a number of lines from the beginning of the file. SKIP includes empty lines, but after the SKIP is complete, FOR /F ignores (does not iterate) empty lines.

要么,它没有正常工作,要么那些行不是空白,而是填充了一些东西......

无论如何,我怎样才能从中得到星期几的结果,而忽略其余的呢?

最佳答案

关于行内容,是的,wmic 的输出在每行的末尾包含一个额外的回车符,该字符由 for 命令检测到。这就是您的非空行的原因。

你可以试试

for /f "tokens=2 delims==" %%Z in ('
    wmic path win32_localtime get dayofweek /value
') do for /f %%Y in ("%%Z") do set "_myday=%%Y"

代码要求 wmickey=value 格式返回信息,并使用等号标记输入记录。由于我们只请求第二个标记,for 将只处理返回至少两个标记的行,具有键(第一个标记)、等号(分隔符)和值(第二个标记)的行

但是,行尾的额外回车也包含在变量的值中。

当变量以正常语法(%_myday%)使用时,它是看不到的,但使用延迟扩展(!_myday!)时,额外的回车将是附和。

为了从变量中删除这个额外的字符,在发布的代码中使用了第二个 for 命令。

关于windows - 为什么 for/f 不忽略空行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31315629/

相关文章:

windows - 在FOR循环中通过复杂的调用检索%ERRORLEVEL%

linux - 对 AIX 和批处理文件的理解和澄清

windows - 在嵌套批处理文件中设置环境变量

javascript - JavaScript 中惯用的嵌套 for 循环

r - 在 Windows 上安装 R Studio 服务器

windows - WaitForSingleObject() vs RegisterWaitForSingleObject()?

windows - struct sockaddr,sin_family不是成员

c++ - MinGW,链接到 Windows 上的 dll

PostgreSQL 格式化时间戳

python - Pandas 将 nan 替换为基于另一列的第一个非 nan 值