我在一个简单的批处理脚本中使用nslookup
和findstr
来检查网站是否正常运行。
但是 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
,这就是这里的问题。即使这种情况常见。
您可以重定向stderr
到nul
(或&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.com
TABnon-printable character
. 因此这可以解释使用时的一些行为/x
,即使 stderr 消息出现在您面前。
Name:TABgoogle.com
Name:SpaceSpaceSpaceSpacegoogle.com
Name: One or More Nonprinting Characters google.com
观察2:我并不是说会nsloopkup
生成任何这些字符,而是告诉您/x
在输出处理中使用时要注意,因为它们不会“打印”可见的内容,所以任何这些潜在字符的出现都会干扰 findstr 在专门过滤/x same character
and/or时的行为/x same_characters_strings
。
其他资源:
Find /?
Findstr /?
- 命令重定向
|
,<
,>
,2>
, ETC。