我正在尝试输出一个文件(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
)
答案 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
循环括在括号中,因此我们可以重定向所有输出只打开输出文件一次,而不是每个文件的一次打开/写入操作。