Windows 批处理脚本,如果文件没有';一开始{

Windows 批处理脚本,如果文件没有';一开始{,windows,batch-file,Windows,Batch File,我需要一些帮助,我也尝试过类似的话题,但我找不到我想要的东西 我需要的是一个批处理脚本,它在目录中循环搜索.pro类型的文件,但不要以字符{开头 然后,脚本搜索所有文件并回显在编号574、和575、之间找到的行 我已经完成了所有的事情,除了当我试图检查文件名时,我无法让它正常工作,而且看起来很简单 我的脚本如下所示: @echo off set "sPath=C:\Users\jspajic\Desktop\batskripte\test\test files" set "ispis=C:\

我需要一些帮助,我也尝试过类似的话题,但我找不到我想要的东西

我需要的是一个批处理脚本,它在目录中循环搜索
.pro
类型的文件,但不要以字符
{
开头

然后,脚本搜索所有文件并回显在编号
574、
575、
之间找到的行

我已经完成了所有的事情,除了当我试图检查文件名时,我无法让它正常工作,而且看起来很简单

我的脚本如下所示:

@echo off

set "sPath=C:\Users\jspajic\Desktop\batskripte\test\test files" 
set "ispis=C:\Users\jspajic\Desktop\batskripte\test\Opera_procesi_DataTabovi.txt"

echo %sPath% > %ispis%

pushd %sPath%

for %%f in (*.pro) do (          :: ---> I guess this part needs to be altered

setlocal enabledelayedexpansion

    for /f "delims=]" %%a in ('findstr /n /B "574," "%%f"') do (set s=%%a )

    if !s! neq 0 (

        for /f "delims=]" %%b in ('findstr /n /B "575," "%%f"') do (set kraj=%%b)
        if !kraj! neq 0 (

            @set /a "ss=s+1"
            @set /a "kraj=kraj+0"
            @set /a "s=s+0"

            if !ss! NEQ !kraj! (

                @echo:
                echo %%f



                @set /a "counter=1"
                for /F "tokens=1* delims=:" %%A in ('type "%%f" ^| findstr /n "^"') do (

                    if !counter! GTR !s! if !counter! LSS !kraj! echo.%%B

                    @set /a "counter=counter+1"
                )
            )   
        )

    )
endlocal

) >> %ispis%

popd
我在('dir/B*.pro^ | findstr“[a-z]*\.pro]”中尝试了
for/f“delims=“%%a”)
或者有类似的想法,但我不能让它工作,因为我只是不知道批处理脚本那么好

for %%f in (*.pro) do ( set "dummy=%%f"
 setlocal enabledelayedexpansion
 if "!dummy:~0,1!" neq "{" (
应该可以解决您的问题。请注意,它添加了一个额外级别的括号,因此需要在
endlocal
之后添加一个匹配的
,但您似乎很擅长这样做

将文件名分配给一个伪变量,然后在执行其余代码之前查看该伪变量的第一个字符是否不等于“{”

在提示符下,
set/?
将显示有关子字符串的文档-您似乎已解决了
延迟扩展问题

应该可以解决您的问题。请注意,它添加了一个额外级别的括号,因此需要在
endlocal
之后添加一个匹配的
,但您似乎很擅长这样做

将文件名分配给一个伪变量,然后在执行其余代码之前查看该伪变量的第一个字符是否不等于“{”


从提示符处,
set/?
将显示有关子字符串的文档-您似乎已解决了
延迟扩展问题。

因为您的角色没有大小写(上下),并且您的搜索目录已经是最新的;在
for
循环中使用
EOL
可以很容易地满足以下要求:

For/F“EOL={Delims=“%%F In('Dir/B/A-D*.pro')Do(

因为您的角色没有大小写(上|下),并且您的搜索目录已经是最新的;这可以很容易地满足您在
for
循环中使用
下线的要求:

For/F“EOL={Delims=“%%F In('Dir/B/A-D*.pro')Do(

使用
for/f
dir
,通过
findstr
过滤(消除以
{
开头的所有标记):


使用
for/f
dir
,通过
findstr
过滤(消除以
{
开头的所有标记):


可能会出现文件名错误,其中包含
{
(但不作为第一个字符)How,@Stephan?感谢您的评论。不幸的是,使用此选项,我收到一条消息“EOL此时出乎意料……如果存在问题,则可能会出现问题。”{在文件名的其他地方,所以我接受了前面的注释作为解决方案。{根据帮助文件,
eol
给出了一个“行结束注释字符”。刚刚尝试过它;显然,“行结束注释”的意思是“行开始于…”。抱歉,按预期工作。(提醒自己:除非你真的尝试过,否则永远不要相信文档)别担心,@Stephan,从技术上说,帮助应该是行的开始/开始。Josip,它是有效的,正如Stephan所确认的,你的错误消息向我暗示你错过了
“EOL={Delims”前后的开始或结束双引号=“
。在您的特定情况下,我的答案比其他给定的答案更有效。可能会出现文件名错误,其中包含
{
(但不是第一个字符)How,@Stephan?谢谢您的评论。不幸的是,使用此选项我收到一条消息“EOL此时出乎意料……如果文件名中有{其他地方,则可能会出现问题,因此我将上一条注释作为解决方案?”根据帮助文件,
EOL
给出了一个“行结束注释字符”。只是尝试了一下;显然,“行结束注释”的意思是,“行开始于…”。抱歉,按预期工作。(注意:除非您真正尝试过,否则永远不要相信文档)别担心,@Stephan,帮助应该严格地说是行的开始/开始。Josip,它工作了,正如Stephan所确认的,您的错误消息向我暗示,您错过了
“EOL的开始或结束双引号={Delims=“
。在您的具体情况下,我的答案比其他给出的答案更有效。
for /f "delims=" %%f in ('dir /b /a-d *.pro^|findstr /vb "{"') do (