第一个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
,而不是for
2
是"逻辑设备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";是一个文件,每行包含主机及其日志。