在Windows批处理文件中做一些数学/操作'find'输出

时间:2015-04-06 03:00:13

标签: batch-file

我正在尝试输出一个文件(count.txt),其中包含当前目录中每个csv和tab文件的名称以及该文件中的行数。虽然标签文件需要它的值除以4.另外,我想摆脱10个破折号找到'输出并可能返回文件名。我如何抓住发现并操纵它的输出?

    del count.txt
    for %%f in (*.csv) do (
        find /c /v "" %%f >> count.txt
    )
    for %%f in (*.tab) do (
 ::need to divide the next value by 4
        find /c /v "" %%f >> count.txt
    )

1 个答案:

答案 0 :(得分:0)

已修改以纠正错误并适应评论

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Define extensions to handle
    set "extensions=.tab .csv"

    rem Define dividers for each extension
    set ".tab=4"
    set ".csv=1"

    rem Retrieve starting folder from command line
    rem If not present, assume current folder 
    set "root=%~1" & if not defined root set "root=%cd%"

    rem For each folder starting at the indicated root 
    rem     Change current path to the folder that will be processed and
    rem       (%%X) For each extension in list
    rem         (%%a/%%b) For each matching file/lines number processed by find command
    rem            Calculate the number of lines
    rem            Echo file information
    rem     Return to previous active directory

    (for /r "%root%" /d %%F in (.) do (
        pushd "%%~fF" && (
            for %%X in (%extensions%) do if exist ".\*%%~X" (
                for /f "tokens=2,3 delims=\:" %%a in ('
                    find /c /v "" ".\*%%~X" 2^>nul
                ') do (
                    set /a "numLines=%%b / %%~xa"
                    setlocal enabledelayedexpansion 
                    for %%c in (!numLines!) do (
                        endlocal
                        echo [%%~fa] [%%c]
                    )
                )
            )
            popd
        )
    )) > count.txt

每个for循环的任务是

%%F将从指定的起点递归文件夹层次结构

%%X将迭代扩展列表以处理

%%a将对所有指定的文件执行find命令,并使用反斜杠和冒号分割每一行。斜杠包含在find命令的输出中,因为我们使用对每个文件的相对引用(.\*.csv)。这样就消除了初始破折号和空格。然后冒号用于将文件名与行计数分开。最后%%a将保留文件名,%%b保留行数。

一旦我们拥有了必需的元素,我们就需要延迟扩展活动来访问计算结果。文件扩展名用于使用为每种情况定义的变量来确定分隔符。

%%c延迟扩展活动会导致包含!名称的文件出现问题,因此我们需要在执行{{1}之前禁用(endlocal)延迟扩展因此,aditional echo命令用于保存需要回显的行数的值。如果禁用延迟扩展,则会回显信息。

外部for循环括在括号中,因此我们可以重定向所有输出只打开输出文件一次,而不是每个文件的一次打开/写入操作。