Исключение, вызывающее "GetHostEntry" с аргументом (ами) "1": "Нет такого устройства или адреса"

FQDN для этой машины:

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

Да... работать напрямую с powershell дает FQDN из dur.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 и добавляя знак доллара $, Это зарезервированное слово?

Бонусные баллы за разъяснение используемой терминологии.

2 ответа

Кажется, что существует путаница в том, что делает имя хоста и в чем разница между командой и строкой. Давайте посмотрим на первую часть, которая работает:

[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

Вы используете hostname в качестве строки, и эта строка отсутствует в вашем файле hosts, как и localhost, она не удастся.

Если вам нужны имена локальных хостов по умолчанию, то они:

'127.0.0.1'
$env:COMPUTERNAME
'localhost'

Итак, ты должен сделать это

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

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

stackru.com
google.com
WS01
WS01
WS01

См. Также этот пост об использовании собственного командлета Resolve-DnsName против библиотек.NET.

Почему бы просто не использовать встроенные командлеты DNS? Или есть конкретная причина, по которой вы путешествуете по сырому пути.Net? Код проекта, домашнее задание, любопытство?

PowerShell, как преобразовать имя в IP-адрес с помощью метода Windows

Другие вопросы по тегам