循环和 nslookup 的批处理脚本

Batch script for loop & nslookup

我以前看过这个问题,但是 none 的解决方案解决了我的问题。我只是想遍历包含主机名的文本文件。当我从命令行尝试相同的命令(省略额外的百分号)时,它会工作一次或两次,然后给出下面提到的错误。 运行 它作为一个批处理文件,批处理文件不做任何事情就退出了。这个真的难倒我了。

这是我的批处理文件中的代码:

@echo off
set OUTPUTFILE=Results/Results.txt
set lookup=HostNames.txt
FOR /F %%i in (%lookup%) do 
FOR /F "usebackq skip=3 delims=: tokens=2" %j in (`nslookup %i`) 
do @echo %%i %%j >> %OUTPUTFILE%

在命令行我得到:

i`) was unexpected at this time.

当我在命令行 运行 它时,我在批处理文件中 运行 时取出了额外的百分号。我还在命令行中使用绝对路径,以确保这不是我设置的环境变量的问题。

这样试试:

@echo off
set "OUTPUTFILE=Results\Results.txt"
set "lookup=HostNames.txt"
FOR /F %%i in (%lookup%) do  (
    FOR /F "usebackq skip=3 delims=: tokens=2" %%j in (`nslookup %%i`) do (
        @echo %%i %%j >> %OUTPUTFILE%
    )
)
@echo off
set OUTPUTFILE=Results\Results.txt
set lookup=HostNames.txt
FOR /F %%i in (%lookup%) do ( 
 FOR /F "skip=3 delims=: tokens=2" %%j in ('echo(^|nslookup %%i') do @echo %%i %%j >> %OUTPUTFILE%
)

问题: /是winbatch中的一个开关; \ 是目录级分隔符。

do ( 必须与其 for

在同一物理线路上

%i 应该是 %%i

%j 应该是 %%j

我删除了 usebackq 并将引号从反引号更改为单引号,因为这里没有必要使用 usebackq


(添加了小修复)

"flashing cursor" 是由 nslookup 从键盘请求信息引起的。添加 echo( 提供一个换行符来终止 nslookup 并且 ^| 是一个转义管道,它将 echo 的输出定向到 nslookup.[= 的输入27=]

由于我的设置与您的完全不同,我只能进行原始验证。

@Magoo 为我的需求提供了最佳答案。一旦我解决了一个主要问题,批处理文件就会按预期工作:孩子们,不要使用 windows 内部命令名称来命名您的批处理文件。我调用了导致严重脑损伤的批处理文件 "nlookup.bat";我不会很快忘记的一课。

谢谢大家,现在一切正常!

我修改了Magoo的答案输出到CSV文件。它将输出两列“#,输入,输出”,其中每次成功的 nslookup 调用都会有两行,一行包含主机名,另一行包含 IP。我还修改了 delims 以分隔“:”和“”,以便输出没有一堆额外的空格。我想将每个查询包含在具有列 "Input, Hostname, IP" 的单行中,但我很沮丧,所以我只是在循环中添加了一个计数器并将其输出为每个单独查询的第一列,并认为这已经足够了。

@echo OFF
setlocal enabledelayedexpansion enableextensions
set me=%~n0
set parent=%~dp0
set outputfile=%parent%nslookup_results.csv
set inputfile=%parent%nslookup_input.txt
@echo #,Input,Output >> %outputfile%
FOR /F %%G in (%inputfile%) do (
 set /a resultcount+=1
 FOR /F "skip=3 tokens=2 delims=: " %%J in ('echo(^|nslookup %%G') do @echo !resultcount!,%%G,%%J >> %outputfile%
)