如何让Windows批处理脚本读取CSV主机名批量检查另一CSV中是否存在
批量验证CSV主机名是否存在于日志CSV的批处理脚本
修改思路
通过嵌套For循环实现批量处理:外层循环读取hostname.csv中的每一行主机名,内层循环调用find /C命令统计该主机名在logging.csv中的出现次数,根据统计结果输出对应提示。同时保留原脚本的时间记录逻辑,新增文件存在性检查避免无意义报错。
修改后的完整代码
@echo off setlocal enabledelayedexpansion echo %date% %time% Starting Program echo ----------------------------------------------------------------------------------------------------------------- echo Checking files echo ----------------------------------------------------------------------------------------------------------------- :: 检查必要文件是否存在 if not exist "hostname.csv" ( echo ERROR: hostname.csv not found! pause exit /b 1 ) if not exist "logging.csv" ( echo ERROR: logging.csv not found! pause exit /b 1 ) FOR /F "tokens=2" %%i in ('date /t') do set mydate=%%i set mytime=%time% echo Performing Magic ... echo ----------------------------------------------------------------------------------------------------------------- :: 外层循环读取hostname.csv中的每个主机名 for /f "delims=" %%h in (hostname.csv) do ( :: 跳过空行(可选,根据实际CSV格式调整) if "%%h"=="" goto :next_host :: 内层循环统计当前主机名在logging.csv中的出现次数 for /f "tokens=3" %%c in ('find /C "%%h" "logging.csv"') do ( if %%c EQU 0 ( echo * %%h was NOT found in logging.csv ) else ( echo * The device %%h is logging (found %%c times) ) ) :next_host ) echo ----------------------------------------------------------------------------------------------------------------- echo %date% %time% Program Completed pause
关键说明
- 外层For循环:
for /f "delims=" %%h in (hostname.csv)使用delims=确保读取整行内容,避免主机名包含空格时被截断。如果你的hostname.csv带表头,可添加skip=1参数跳过第一行,例如:for /f "skip=1 delims=" %%h in (hostname.csv) - 空行处理:添加
if "%%h"=="" goto :next_host跳过CSV中的空行,避免无效检查 - 统计逻辑修正:原脚本的判断逻辑存在偏差(将找到1次判定为未找到),修改为
if %%c EQU 0表示未找到,否则输出具体的匹配次数 - 文件存在性检查:新增对
hostname.csv和logging.csv的存在性验证,提前报错终止执行,避免后续无意义的循环
内容的提问来源于stack exchange,提问作者earthworm
相关产品推荐
相关产品推荐

