【问题标题】:Batch: All lines above number skip are shown, when only the line number skip is needed批处理:显示所有跳过编号的行,当只需要跳过行号时
【发布时间】:2015-08-02 03:39:26
【问题描述】:

我正在尝试创建一个批处理文件,将名称列表转换为格式为(姓氏)(名字的第一个字母)的用户名,例如 Robert Smith -> SmithR 我已经对大部分内容进行了排序,但是我遇到了一个问题,它循环文本文档中的行,我不确定它为什么会这样做。我想知道你们是否可以告诉我如何解决它

提前致谢^-^

代码:http://pastebin.com/zDtJrPrV 姓名:http://pastebin.com/xbh3WTSv

【问题讨论】:

    标签: loops batch-file


    【解决方案1】:

    您的脚本效率低下,而且比它需要的要长得多。您的第一个for /f 循环遭受findstr 的无用使用,如果您的名称文件包含任何空行,这实际上弊大于利。并且为名称文件的每一行启动一个新的for /f "skip=N" 将导致文件在每次迭代时都被打开、读取和关闭,而实际上它只需要打开一次。并且使用find /c 来计算文本文件的行数更加优雅。

    这里,加盐调味:

    @echo off
    setlocal
    
    set "names=names.txt"
    set "outfile=outfile.txt"
    
    for /f %%I in ('find "" /v /c ^< "%names%"') do set /a "lines=%%I"
    
    choice /c YN /n /m "Preparing to process %lines% lines.  Continue? (y/n) "
    
    if errorlevel 2 goto :EOF
    
    >"%outfile%" (
        setlocal enabledelayedexpansion
        for /f "usebackq tokens=1*" %%I in ("%names%") do (
            set "first=%%I"
            echo %%J!first:~0,1!
        )
        endlocal
    )
    

    【讨论】:

    • +1 加点胡椒粉,for /f %%I in ('find "" /v /c ^&lt; "%names%"') ...for /f %%I in ('type "%names%" ^| find "" /v /c') ... 效率更高;)
    • @Aacini 谢谢!已实施。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多