0

对于FQDN这台机器:

thufir@dur:~$ 
thufir@dur:~$ hostname --fqdn
dur.bounceme.net
thufir@dur:~$ 

是的...直接使用powershell可以:FQDNdur.bounceme.net

thufir@dur:~/powershell$ 
thufir@dur:~/powershell$ pwsh
PowerShell v6.0.1
Copyright (c) Microsoft Corporation. All rights reserved.

https://aka.ms/pscore6-docs
Type 'help' to get help.

PS /home/thufir/powershell> 
PS /home/thufir/powershell> [System.Net.Dns]::GetHostByName((hostname)).HostName                                        
dur.bounceme.net
PS /home/thufir/powershell> 

但是如果我想遍历一个数组呢?我如何获得FQDN显示为dur.bounceme.net

thufir@dur:~/powershell$ 
thufir@dur:~/powershell$ ./hostname.ps1 
dur.bounceme.net
beginning loop
google.com
Exception calling "GetHostEntry" with "1" argument(s): "No such device or address"
At /home/thufir/powershell/hostname.ps1:14 char:3
+   $fqdn = [System.Net.Dns]::GetHostEntry($i).HostName
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ExtendedSocketException

google.com
localhost
end
thufir@dur:~/powershell$ 

脚本:

#!/usr/bin/pwsh -Command


#hostname is a reserved variable name?

[System.Net.Dns]::GetHostByName((hostname)).HostName


"beginning loop"

$hosts = ("google.com", "hostname", "localhost")

foreach($i in $hosts) {
  $fqdn = [System.Net.Dns]::GetHostEntry($i).HostName
  write-host $fqdn
}


"end"

我尝试从周围删除引号hostname并添加美元符号$。这是保留字?

解释所涉及术语的奖励积分。

4

2 回答 2

1

您正在使用主机名作为字符串,并且该字符串不在您的主机文件中,就像 localhost 一样,它将失败。

如果您使用的是默认 localhost 名称,那么它们是:

'127.0.0.1'
$env:COMPUTERNAME
'localhost'

所以,你应该这样做

$TargetHosts = ('stackoverflow.com','google.com', $env:COMPUTERNAME,'localhost','127.0.0.1')

foreach($TargetHost in $TargetHosts) 
{ ( $fqdn = [Net.Dns]::GetHostEntry($TargetHost).Hostname ) }

stackoverflow.com
google.com
WS01
WS01
WS01

另请参阅这篇关于使用本机 Resolve-DnsName cmdlet 与 .NET 库的文章。

为什么不直接使用内置的 DNS cmdlet?还是有什么特殊原因让您沿着原始的 .Net 路径旅行?代码项目、家庭作业、好奇心?

powershell如何使用Windows方法将名称解析为IP地址

于 2018-02-16T07:20:54.970 回答
1

似乎对主机名的作用以及命令和字符串之间的区别存在混淆。让我们看看第一部分有效:

[System.Net.Dns]::GetHostByName((hostname)).HostName

Powershell 将其解析为

Run command hostname, 
Call GetHostByName(), pass hostname's output as a parameter to the call
from that result, show the HostName attribute

在 foreach 循环中,参数作为字符串传递。因此在主机名情况下:

$i <-- hostname
[System.Net.Dns]::GetHostEntry($i).HostName

被解析为

Call GetHostEntry("hostname")
from that result, show the HostName attribute
于 2018-02-16T07:24:01.727 回答