Loops 如果命令未运行,则批处理

Loops 如果命令未运行,则批处理,loops,for-loop,batch-file,if-statement,Loops,For Loop,Batch File,If Statement,我试图在一些文件中获取几行,并将它们存储在变量中(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

我试图在一些文件中获取几行,并将它们存储在变量中(
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

您用引号传递了调用,因此您应该首先将其剥离(或使用
usebackq
)。
另外,在测试时,不要使用
exit

试试这个,看看是否有效:
(为了使结构更清晰,请尝试注释
@echo off
以获取更多详细信息。)

for
将把带引号的输入作为字符串而不是文件。
%~1
将删除
%1
的引用。

查看
以获取/?
呼叫/?
以了解更多详细信息。

您是否尝试过放置
echo cnt!cnt在if语句之前?这就是我在这里的原因。您应该在这些迭代中使用反引号,因为您已经负责地双引号引用了传递的参数,即,/F“UseBackQ Skip=4 Tokens=*”%%b In(%1)Do(
此外,您提供的示例
.md
内容在
1
行上显示了您的
标题
,在
3
行上显示了预期的新文件基名斜体,在标准
For/F
循环中,它将是第
2行
,因为不会处理空行。事实上,如果
跳过
第一个
>4
行,您提供的所有内容都将被跳过。请您明确说明您希望保存到变量的行,以及您问题中的文件内容是否是实际文件的真实表示。概述实际任务,而不是您希望发布的代码做什么,也将有助于我们帮助您。是的,我“理解for循环”会忽略空行,但“跳过”选项不会。它现在工作正常。正确,
%~1
将从
%1
中删除周围的双引号,但是,任何包含空格或可能有毒字符的文件名都不会按预期工作。请查看我的注释以了解如何修复该问题。@Compo是的,我是同样的想法。刚刚更新了我的答案。谢谢:好的,工作得更好。但是仍然没有得到echo的。我应该没有吗?而且我注意到文件中的所有行都被解析了,即使在第4行之后,那么在第4行之后跳出循环的好方法是什么呢?我尝试了你的示例内容和文件名,它实际上是回音的。也许给你一些建议给我们更多的样本数据?我想跳过可以在里面使用
goto:eof
。@tyee当然。@tyee
@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