用于比较两个csv文件的Windows批处理脚本



第一个csv文件包含主机名列表。第二个csv文件包含主机名和日志。我想使用批处理文件比较第二个csv文件中是否存在主机名列表。

for /f "skip=1" %%e in (hostname.csv) do findstr /i "%%e" logging.csv >nul&if errorlevel 1 (echo %date% %time%: Node %%e has NOT reported in the last 24 hours >> missing.txt | echo %date% %time%: Node %%e has NOT reported in the last 24 hours) else (echo %date% %time%: Node %%e reported in the last 24 hours >> found.txt)

我需要跳过第二个文件(Logging.csv)中的前两行。我该如何完成?

for /f %e in (file1) do findstr "%e" file2 >nul&if errorlevel 1 (echo %e>>missing) else (echo %e>>found)

作为来自提示的命令。如果作为批处理行运行,请将每个%e更改为%%e

[未经测试]


评论后的修订

@ECHO OFF
SETLOCAL
for /f "skip=1" %%e in (hostname.csv) do (
SET "found="
FOR /f "delims=:" %%y in ('findstr /i /n "%%e" logging.csv 2^>nul') DO IF %%y gtr 2 SET "found=%%y"
if DEFINED found (
echo %date% %time%: Node %%e reported in the last 24 hours >> found.txt
) else (
echo %date% %time%: Node %%e has NOT reported in the last 24 hours >> missing.txt
echo %date% %time%: Node %%e has NOT reported in the last 24 hours
)
)
GOTO :EOF

首先,我重新格式化了代码。

在修订版中,我使用了if defined检测变量当前是否定义的特性,使用found作为标志。

%%e依次设置为hostname.csv中的每个主机名,第一行中的名称除外(跳过=1)

则CCD_ 7为"0";设置";到nothing,这就取消了定义。

然后使用findstr来定位文件中的主机名。/i表示忽略情况,/n指示通过在findstr报告前面加上originalfilelinenumber:来对行进行编号。2^>nul抑制由findstr产生的错误消息(插入符号^告诉cmd>属于findstr,而不是for2是"逻辑设备2"或错误列表设备)

如果在第1行找到%%e,则生成的报告类似于1: data data %%e data data

然后,for /f解释findstr报告行,并将该行上的数据(最多但不包括分隔符(:))分配给%%y,如果该行号(来自logging.txt的原始行号)Greater大于2,则设置found

因此,found然后被设置或不被设置,产生适当的数据。

我不知道你的文件的结构,但我希望这个PowerShell脚本能有所帮助:

foreach($line in Get-Content .Hosts.csv) {
if(Get-Content .Logs.csv | Select-String $line){
echo "The host $line exists!"
}
else{
echo "The host $line doesn't exist."
}
}

其中;Hosts.csv";是您的主机列表,以及";Logs.csv";是一个文件,每行包含主机及其日志。

相关内容

  • 没有找到相关文章

最新更新