【问题标题】:batch file programming批处理文件编程
【发布时间】:2010-09-25 09:46:30
【问题描述】:

我试图将一个文件从起始行复制到另一个文件,直到达到限制。 IE。, 第 1 到 10 行(file1.txt)->file2.txt 但是在写“!”时被跳过。我能做些什么来解决它。任何帮助将不胜感激。

该函数的循环如下所示。

%NF%-> new file.

%EF%-> existing file

%1% -> line number(passed from another part)

:_doit

findstr /N /R "." %EF%|findstr /B /C:"%1:">nul

if errorlevel 1 (    
    echo. >>%NF%        
) else (    
    for /f "tokens=1 delims=" %%a in ('findstr /N /R "." %EF%^|findstr /B /C:"%1:"') do (    
        if [%%a] EQU [] (    
            echo. >>%NF%    
        ) else (    
            echo %%a >>%NF%    
       )     
   )
)

【问题讨论】:

    标签: file batch-file


    【解决方案1】:

    如果可以下载工具,可以使用GNU win32 gawk

    gawk.exe "NR>10{exit}1"  file1 > file2
    

    你可以看看这个类似的帖子here

    【讨论】:

    • 是的,它只是一个命令。所以把这个命令放在你的批处理文件中。
    • 你知道消失的原因是什么“!”从一个文件写入另一个文件时批处理文件中的符号?
    【解决方案2】:

    原因是扩展延迟,如果禁用它,还有!按预期工作。 您只能在循环中禁用它。

    if errorlevel 1 (    
        echo. >>%NF%        
    ) else (
       setlocal DisableDelayedExpansion
        for /f "tokens=1 delims=" %%a in ('findstr /N /R "." %EF%^|findstr /B /C:"%1:"') do (    
            if [%%a] EQU [] (    
                echo. >>%NF%    
            ) else (    
                echo %%a >>%NF%    
           )     
       )
       endlocal
    )
    

    批处理行的解析器有多个阶段: 第一个阶段是 %var% 扩展,然后是特殊字符阶段 "^&|() 在 %%a 阶段之后,延迟(感叹阶段)。

    这就是为什么!在你的情况下消失。 因为你从你的文件中得到了这样的东西 %%a=你好! 然后感叹阶段尝试扩展!,但失败并被删除。

    如果在您的文件中是该行 你好^! 你进入了你的“副本” 你好!

    但在批处理文件中,您需要两个插入符号来显示一个!

    echo hello^^!
    

    因为在第二阶段,^^!被膨胀到 ^!,并且在感叹号阶段最后一个插入符号逃脱了!

    【讨论】:

    • 但是我将 DisableDelayedExpansion 放在下一个 else 块中才能正常工作。谢谢。
    • if errorlevel 1 ( echo. >>%NF% ) else ( for /f "tokens=1 delims=" %%a in ('findstr /N /R "." %EF%^ |findstr /B /C:"%1:"') do ( if [%%a] EQU [] ( echo. >>%NF% ) else( setlocal DisableDelayedExpansion echo %%a >>%NF% endlocal ) ) )
    • 请注意for /f 将跳过空行。
    • 可以,但不能有空行,因为 findstr /N 总是在行号前面
    【解决方案3】:
    if errorlevel 1 ( 
        echo. >>%NF% 
    ) else ( 
        for /f "tokens=1 delims=" %%a in ('findstr /N /R "." %EF%^|findstr /B /C:"%1:"') do ( 
           if [%%a] EQU [] ( 
              echo. >>%NF% 
           ) else( 
              setlocal DisableDelayedExpansion 
              echo %%a >>%NF%
              endlocal
           ) 
        )
    )
    

    【讨论】:

    • 有两个问题,“回声”。比“echo(”慢两倍,如果存在名为“echo”的文件,它会失败。第二个问题是长文件,你的代码不起作用,因为你没有使用 endlocal,因此你得到了溢出。
    【解决方案4】:

    也许使用来自UnxUtils的gawk.exe:

    gawk "NR<10" < file1 > file2
    

    【讨论】:

    • 更好的 GNU gawk:gnuwin32.sourceforge.net/packages/gawk.htm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多