#powershell
#powershell
Вопрос:
Как я могу объединить этот код для проверки IP-адреса и вывести результат в Gridview?
function Test-IP
{
param
(
[Parameter(Mandatory = $true)]
[ValidateScript({ $_ -match [IPAddress]$_ })]
[String]$ip
)
$ip
Write-Host "$($ip) is resolved to $([System.Net.Dns]::GetHostbyAddress($($IP)))"
}
while (!Test-IP -ip "$($Input)")
{
$input = Read-Host -Prompt 'Input your IP address'
}
$zones = Get-DnsServerZone - Server PRDDNS05-VM | Where-Object { !$_.IsReverseLookupZone -and $_.ZoneType -eq 'Primary' }
$output = foreach ($zone in $zones)
{
Get-DnsServerResourceRecord -ZoneName $zone.ZoneName |
Where { $_.RecordData.Ipv4Address.IPAddressToString -contains $Input } |
Select IPV4Address, HostName, RecordType, Type, RecordData, Timestamp, TimeToLive, @{ n = 'Zone'; e = { $zone.ZoneName } }
}
$output | Out-GridView
Приведенный выше скрипт используется для сброса всех записей DNS, которые содержат определенный IP-адрес, введенный пользователем.
Комментарии:
1.
$input
является автоматической переменной в Powershell. Вам не следует переопределять его как вводимую вами переменную. Переименование даст лучшие результаты.2. Да, ты прав, чувак 🙂 спасибо за предложение.
Ответ №1:
Это своего рода странная конструкция, поскольку я не уверен, почему вы используете эту функцию таким образом, какой вы есть. Это означает, что выполняется функция с требуемым обязательным параметром, а затем проверка, следует ли определить, был ли он введен, и, если нет, отправить узел чтения, пока пользователь этого не сделает. Обязательный означает, обязательный. Не продолжайте, пока что-то не введено.
Если вы проверяете, просто чтобы убедиться, что пользователь вводит правильный IPA, затем проверьте это в параметре validate. Имеется в виду разрешить только формат IPA.
Кроме того, это…
Get-DnsServerZone - Server PRDDNS05-VM
… недопустимый синтаксис. Для этого командлета нет параметра с именем -Server. Существует только …
# Get specifics for a module, cmdlet, or function
(Get-Command -Name Get-DnsServerZone).Parameters
(Get-Command -Name Get-DnsServerZone).Parameters.Keys
# Results
<#
Name
ComputerName
VirtualizationInstance
CimSession
ThrottleLimit
AsJob
Verbose
Debug
ErrorAction
WarningAction
InformationAction
ErrorVariable
WarningVariable
InformationVariable
OutVariable
OutBuffer
PipelineVariable
#>
Get-help -Name Get-DnsServerZone -Examples
Get-help -Name Get-DnsServerZone -Full
Get-help -Name Get-DnsServerZone -Online
…и между тире и Имя_парамЕтра никогда не бывает пробелов. Я предполагаю, что это была просто опечатка в сообщении, но просто скажите «in».
Выполняя это шаг за шагом, просто спросите основы.
function Test-IPaddress
{
[CmdletBinding(SupportsShouldProcess)]
Param
(
[Parameter(Mandatory = $true,
ValueFromPipelineByPropertyName = $true,Position = 0)]
[ValidateScript({$_ -match [IPAddress]$_ })]
[string]$IPAddress
)
Process{[ipaddress]$IPAddress}
}
Try
{
$IPAddress = $((Test-IPaddress -IPAddress (Read-Host -Prompt 'Input a valid IP address')).IPAddressToString)
Out-GridView -InputObject $IPAddress -Title "IPAddress details for $IPAddress"
}
Catch
{
Add-Type -AssemblyName System.Drawing,
PresentationCore,
PresentationFramework,
System.Windows.Forms,
microsoft.VisualBasic
[System.Windows.Forms.Application]::EnableVisualStyles()
[System.Windows.Forms.MessageBox]::Show("Warning message for $IPAddress`n
$($PSItem.Exception.Message)" , 'Error', 'OK', 'Error')
}
Как только мы узнаем, что самый простой вызов работает и выводится в OGV должным образом, вы можете добавить свой другой код в блок try и отформатировать его так, чтобы он также соответствовал OGV.
Обновление в соответствии с моим комментарием
db-ip.com/all/113.67.32
Test-Connection -ComputerName db-ip.com | Format-Table -AutoSize
# Results
<#
Source Destination IPV4Address IPV6Address Bytes Time(ms)
------ ----------- ----------- ----------- ----- --------
L... db-ip.com 104.26.5.15 32 15
L... db-ip.com 104.26.5.15 32 12
L... db-ip.com 104.26.5.15 32 12
L... db-ip.com 104.26.5.15 32 11
#>
Test-Connection -ComputerName 104.26.5.15 | Format-Table -AutoSize
# Results
<#
Source Destination IPV4Address IPV6Address Bytes Time(ms)
------ ----------- ----------- ----------- ----- --------
L... 104.26.5.15 32 15
L... 104.26.5.15 32 14
L... 104.26.5.15 32 15
L... 104.26.5.15 32 13
#>
Test-Connection -ComputerName 113.67.32.221 | Format-Table -AutoSize
$Error[0] | Format-List -Force
# Results
<#
writeErrorStream : True
Exception : System.Net.NetworkInformation.PingException: Testing connection to computer '113.67.32.221' failed: Error due to lack of
resources ---> System.ComponentModel.Win32Exception: Error due to lack of resources
--- End of inner exception stack trace ---
TargetObject : 113.67.32.221
CategoryInfo : ResourceUnavailable: (113.67.32.221:String) [Test-Connection], PingException
FullyQualifiedErrorId : TestConnectionException,Microsoft.PowerShell.Commands.TestConnectionCommand
ErrorDetails :
InvocationInfo : System.Management.Automation.InvocationInfo
ScriptStackTrace : at <ScriptBlock>, <No file>: line 1
PipelineIterationInfo : {0, 1, 0}
PSMessageDetails :
#>
Test-NetConnection -ComputerName 113.67.32.221 -TraceRoute
# Results
<#
WARNING: Ping to 113.67.32.221 failed with status: TimedOut
WARNING: Trace route to destination 113.67.32.221 did not complete. Trace terminated :: 0.0.0.0
ComputerName : 113.67.32.221
RemoteAddress : 113.67.32.221
...
PingSucceeded : False
PingReplyDetails (RTT) : 0 ms
...
#>
Ping 113.67.32.221
# Results
<#
Pinging 113.67.32.221 with 32 bytes of data:
Request timed out.
...
Ping statistics for 113.67.32.221:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
#>
tracert 113.67.32.221
# Results
<#
Tracing route to 113.67.32.221 over a maximum of 30 hops
1 1 ms 1 ms 2 ms ...
2 24 ms 22 ms 122 ms ...
3 14 ms 41 ms 19 ms ...
...
12 * * * Request timed out.
13 * * * Request timed out.
#>
telnet 113.67.32.221
# Results
<#
Connecting To 113.67.32.221...Could not open connection to the host, on port 23:
Connect failed
#>
telnet 113.67.32.221 80
# Results
<#
Connecting To 113.67.32.221...Could not open connection to the host, on port 80:
Connect failed
#>
Комментарии:
1. спасибо за ответ. Однако, когда я ввожу общедоступный IP-адрес, я получаю эту ошибку: ————————— Ошибка ————————— Предупреждающее сообщение для исключения 113.67.32.221, вызывающего «GetHostByAddress» с аргументами «1»: «Запрошенное имя допустимо, но данные запрошенного типа не найдены» ————————— ХОРОШО —————————
2. это действительный общедоступный IP-адрес: db-ip.com/all/113.67.32
3. Это может быть законная строка IPA, но этот IPA не разрешается с помощью базовых командлетов PowerShell (или даже старых добрых DOS-файлов), поэтому он не будет разрешен никакими другими кодовыми методами. Смотрите мое обновление для проверки. Поскольку это допустимый IPA, появится OGV. Если вы добавили другой код, это приведет к сбою, как указано в обновлении.
4. Это здорово. Большое спасибо, чувак, за обновление и объяснение. Это отлично работает.
5. Не беспокойтесь. Рад, что у вас все получилось. Мой подход к разработке по умолчанию всегда заключается в выполнении абсолютного минимума кода (начиная только с использования командлетов / exe-файлов и т.д., Без навороченных / творческих штучек (имеется в виду извлечение необработанных данных) и тестировании, чтобы убедиться, что вы можете получить то, что хотите, прежде чем двигаться дальше. Как только я проверю каждый фрагмент / сегмент / блок, я объединяю их в скрипт, модули и т.д. Это просто уменьшает головные боли и ненужное дергание за волосы (которых у меня больше нет;-})