根据用户推荐进行了编辑:
我有一个脚本,可以在成千上万的服务器上运行,该脚本从日志中编译关键字并输出它们在文本文件中出现的次数。每个服务器的输出如下所示:
---------- C:\TEMP\TEXT.001: 0
---------- C:\TEMP\TEXT.002: 0
---------- C:\TEMP\TEXT.003: 2
---------- C:\TEMP\TEXT.004: 0
---------- C:\TEMP\TEXT.005: 1
冒号后的最后一个数字是关键字在日志文件中的出现次数。因此,我有来自数千个服务器的结果文件,然后在其中使用xcopy将框移动到同一文件夹中。
将文件移到我的盒子后,我有一个脚本,该脚本删除冒号之后的所有数据,然后找到总和。在某种程度上,它可以工作,但是仅在单个文件上工作:
@Echo off
set "Total=0"
for /f "tokens=3 delims=:" %%a in (Server1_Count.txt) do Set /a "Total+=%%a"
(echo %%a >> Server1_CountCompleted.txt Total is %Total%)
我遇到了两个问题:
%a总计为34
是否可以添加主机名(文件名的开头前缀)以显示在新生成的文件中,例如:
server1总数为34
答案 0 :(得分:0)
仅使用set /a
时,无需通话或延迟扩展。
提示:处理名称中可能包含空格的文件夹/文件时,最好使用冒号作为delim。
:: Q:\Test\2019\04\01\SO_55461444.cmd
@Echo off
set "Total=0"
for /f "tokens=3 delims=:" %%a in (FILE.txt) do Set /a "Total+=%%a"
echo Total is %Total%
pause
样本输出(德语区域设置):
> SO_55461444.cmd
Total is 3
Drücken Sie eine beliebige Taste . . .
给定文件夹中的新变体迭代文件*_count.txt
:
:: Q:\Test\2019\04\01\SO_55461444.cmd
@Echo off & SetLocal
:: clear/initialize env vars
set "Total=0"
for /F "delims==" %%A in ('set FileTotal[ 2^>nul') Do Set "%%A="
Pushd "X:\path\Folder" || (Echo couldn't change to folder &Pause&exit /b 1)
Echo Processing folder %CD%
Echo:
:: iterate files in folder
For %%F in (*_count.txt) Do (
for /f "tokens=3 delims=:" %%A in (
'Findstr "^-------" "%%F"'
) Do Set /A "FileTotal[%%~nF]+=%%A,Total+=%%A"
)
Set FileTotal[
Echo ===================
echo GrandTotal is %Total%
popd
pause
示例输出:
> Q:\Test\2019\04\01\SO_55461444.cmd
Processing folder Q:\Test\2019\04\02
FileTotal[server1_count]=3
FileTotal[server2_count]=15
===================
GrandTotal is 18
Drücken Sie eine beliebige Taste . . .