为什么/ f不能忽略空行?

Ste*_*ese 5 windows for-loop batch-file

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

使用该命令wmic path win32_localtime get dayofweek为我提供输出:

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


C:\sendemail>
Run Code Online (Sandbox Code Playgroud)

因此,使用以下批处理脚本,我应该能够返回"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%
Run Code Online (Sandbox Code Playgroud)

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

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>
Run Code Online (Sandbox Code Playgroud)

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

跳过SKIP将跳过从文件开头处理多行的操作.SKIP包含空行,但在SKIP完成后,FOR/F忽略(不迭代)空行.

或者,它不能正常工作,或者这些线不是空白的,并且充满了某些东西......

无论如何,我如何得到一周中的一天结果,而忽略其余的?

MC *_* ND 7

关于行内容,是的,输出来自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"
Run Code Online (Sandbox Code Playgroud)

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

但是,该行末尾的附加回车也包含在变量的值中.

当变量与普通语法(%_myday%)一起使用时,它不会被看到,但是如果延迟扩展(!_myday!),则会回显附加回车符.

要从变量中删除此附加字符,for已在发布的代码中使用了第二个命令.


Mic*_*elS 2

这种轻微的中间化将会起作用:

@ECHO OFF
set cmd=wmic path win32_localtime get dayofweek
for /f "tokens=1 skip=1" %%Z in ('%cmd%') do (
    set _myday=%%Z
    GOTO BREAK
)
:BREAK
echo Var is %_myday%
PAUSE
Run Code Online (Sandbox Code Playgroud)

读取所需行后,只需跳出循环即可。