Исключение, вызывающее "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