【问题标题】:Batch IF command not running批处理 IF 命令未运行
【发布时间】:2019-10-15 07:46:53
【问题描述】:

我试图在一些文件中获取几行并将它们存储在变量中(line3 和 line4)。
这是代码:

setlocal EnableDelayedExpansion

for /f "tokens=*" %%a in ('dir *.md /b /o:-n /a:-d') do (
call :getLines "%%a"
)

pause
exit

:getLines
set /A cnt=2
for /f "skip=4 tokens=*" %%b in (%1) do (
set /A cnt+=1
set "line!cnt!=%%b"
if !cnt! == 4 (
    set "filename=%~n1"
    set "blogdate=!filename:~0,10!"
    set "blogtitle=!filename:~11!"
    echo hello
    echo !line3!
    echo !line4!
    echo !filename!
    echo !blogdate!
    echo !blogtitle!
)
)
goto :eof

以上内容甚至不会回显hello。我看不出有什么问题。
这是每个文件的样子:

# Title

*2015-11-17*

Tags: word1 word2

First Sentence is here.

文件名如下所示:

2015-11-17-title.md

【问题讨论】:

  • 您是否尝试过将echo cnt is !cnt! 放在 if 语句之前?
  • 这就是我在这里的原因。
  • 您应该在这些迭代中使用反引号,因为您负责任地双引号传递的参数,即For /F "UseBackQ Skip=4 Tokens=*" %%b In (%1) Do (
  • 此外,您提供的示例 .md 内容显示了您的 Title 在线 1 和预期的新文件 BaseName 斜体在线 3,在标准 For /F 循环中将为2 行,因为空行不被处理。事实上,如果您 skip 第一行 4 行,您提供的所有内容都将被跳过。您能否准确说明您希望将哪些行保存到变量中,以及您问题中的文件内容是否是实际文件的真实表示。实际任务的概述,而不是您希望发布的代码做什么,也可以帮助我们为您提供帮助。
  • 是的,我知道 for 循环会忽略空行,但跳过选项不会。现在运行良好。

标签: loops for-loop batch-file if-statement


【解决方案1】:

您通过引号传递给调用,因此您应该先去掉它(或使用usebackq)。
另外,在您进行测试时,请不要使用exit。
试试这个,看看它是否有效:
(格式化使结构更清晰,请尝试评论@echo off以获取更多详细信息。)

@echo off
setlocal EnableDelayedExpansion

for /f "tokens=*" %%a in ('dir *.md /b /o:-n /a:-d') do (
    call :getLines "%%a"
)

pause
::exit
goto :eof

:getLines
set /A cnt=2
for /f "usebackq skip=4 tokens=*" %%b in (%1) do (
    set /A cnt+=1
    set "line!cnt!=%%b"
    if !cnt! == 4 (
        set "filename=%~n1"
        set "blogdate=!filename:~0,10!"
        set "blogtitle=!filename:~11!"
        echo hello
        echo !line3!
        echo !line4!
        echo !filename!
        echo !blogdate!
        echo !blogtitle!
        goto :eof
    )
)
goto :eof

for 会将带引号的输入作为字符串而不是文件。
%~1 将删除 %1 的引号。
详情请查看for /? 和call /?。

【讨论】:

  • 正确,%~1 将从%1 中去除周围的双引号,但是,任何包含空格或潜在毒字符的文件名都不会按预期工作。请参阅我的评论以了解如何解决此问题。
  • @Compo 是的,我也是这么想的。刚刚更新了我的答案。谢谢:D
  • 好的,工作得更好。仍然没有得到回声。我不应该吗?另外我注意到文件中的所有行都被解析了,即使在第 4 行之后,那么在第 4 行之后跳出循环的好方法是什么?
  • 我尝试了您的示例内容和文件名,它实际上是在回响。也许给我们更多的样本数据?我认为skip可以在里面使用goto :eof。 @tyee
  • 当然可以。 @tyee
猜你喜欢
  • 1970-01-01
  • 2013-03-26
  • 2014-11-21
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多