findstr /X 继续打印没有匹配的行

findstr /X 继续打印没有匹配的行

我在一个简单的批处理脚本中使用nslookupfindstr来检查网站是否正常运行。
但是 findstr 不断打印不包含任何匹配项的行。命令如下:

nslookup goofdedwsgle.com  | findstr /X /C:"Non-existent domain"

结果是

*** one.one.one.one can't find goofdedwsgle.com: Non-existent domain

这正是我要找的。但是,如果我使用现有域:

nslookup google.com 1.1.1.1 | findstr /X /C:"Non-existent domain"

我得到了这个,这绝对不匹配:

Non-authoritative answer:

这似乎是来自完整的 nslookup 输出:

Server:  one.one.one.one
Address:  1.1.1.1

Non-authoritative answer:
Name:    google.com
Addresses:  2404:6800:4004:80a::200e
          142.250.66.78

但为什么会findstr打印出那一行?/X应该保证findstr只打印出匹配项吧?
更奇怪的是,如果我创建一个与结果内容相同的 txt 文件nslookup,然后运行findstr /X /C:"Non-existent domain"它,它会显示为空。
这里的问题是什么?

答案1

nslookup似乎总是在流Non-authoritative answer:中输出stderr,这就是这里的问题。即使这种情况常见

您可以重定向stderrnul(或&1=stdin如果需要)作为解决方法:

nslookup google.com 1.1.1.1 2>nul | findstr /X /C:"Name:    google.com"

结果:

名称:google.com

或者使用没有此问题的更现代的 PowerShell 函数,并且对它们进行过滤也更容易:

Resolve-DnsName -Name google.com -Server 1.1.1.1

答案2

您还可以使用更简单的命令重定向stderr "2"到和>&过滤器,或者,甚至使用简单的stdout "1"find "string"findstr /end "string"findstr "string"

将 stderr 重定向到 stdout 2&1

nslookup google.com 1.1.1.1 2>&1 | findstr /e "google.com"
Nome:    google.com

nslookup google.com 1.1.1.1 2>&1 | findstr "google.com"
Nome:    google.com

nslookup google.com 1.1.1.1 2>&1 | find "google.com"
Nome:    google.com

观察1:尽管输出是/返回,你也可以认为你在这个“空”空间中看到的是空格,但它可以是,很少是一些Name:[some spaces]google.comTABnon-printable character. 因此这可以解释使用时的一些行为/x,即使 stderr 消息出现在您面前。

Name:TABgoogle.com
Name:SpaceSpaceSpaceSpacegoogle.com
Name: One or More Nonprinting Characters google.com

观察2:我并不是说会nsloopkup生成任何这些字符,而是告诉您/x在输出处理中使用时要注意,因为它们不会“打印”可见的内容,所以任何这些潜在字符的出现都会干扰 findstr 在专门过滤/x same characterand/or时的行为/x same_characters_strings


其他资源:

相关内容