Я пишу скрипт, который берет неструктурированный ввод, переформатирует его и выплевывает CSV.Расчетная величина add-member Powershell
В одном из членов я хочу сделать NSLOOKUP другого члена, чтобы получить запись DNS, связанную с IP. Тем не менее, количество записей имеет IP-адрес 0.0.0.0, например. это прослушивающий порт, пока клиент еще не подключен.
Эти ошибки вызывают ошибки NSLOOKUP, совершенно правильно, потому что для него нет записи DNS.
Итак, я изменил свой код только для NSLOOKUP, если IP-адрес не был 0.0.0.0, в противном случае возвращает пустую строку.
Но я не могу заставить его работать.
Следующие подбрасывает без ошибок:
$srcdata -split "`r`n"|foreach {
$obj = New-Object System.Object
$obj|Add-Member -MemberType NoteProperty -Name Connection_ID -Value $_.Split(",")[0]
$obj|Add-Member -MemberType NoteProperty -Name Filename -Value $_.Split(",")[1]
$obj|Add-Member -MemberType NoteProperty -Name MCP_Port -Value $_.Split(",")[2]
$obj|Add-Member -MemberType NoteProperty -Name Client_Port -Value $_.Split(",")[3]
$obj|Add-Member -MemberType NoteProperty -Name Port_State -Value $_.Split(",")[4]
$obj|Add-Member -MemberType NoteProperty -Name Client_IP -Value $_.Split(",")[5]
$obj|Add-Member -MemberType NoteProperty -Name Client_DNS -value {If ($obj.Client_IP -ne "0.0.0.0") {(NSLOOKUP $obj.Client_IP|Select-String Name).Line.ToString().Replace(" ","").Split(":")[1]} else {""}}
$obj|Add-Member -MemberType NoteProperty -Name Protocol_Stack -Value $_.Split(",")[6]
$outfile += $obj
}
Но если я осмотреть один из объектов в массиве я не вижу:
Connection_ID : 1
Filename : CCF_MARC1
MCP_Port : 2001
Client_Port : 0
Port_State : LISTEN
Client_IP : 0.0.0.0
Client_DNS : If ($obj.Client_IP -ne "0.0.0.0") {(NSLOOKUP $obj.Client_IP|Select-String Name).Line.ToString().Replace(" ","").Split(":")[1]} else {""}
Protocol_Stack : LEGACY
Если я обернуть в скобках, а не в ScriptBlock , поэтому настройка Client_DNS линия выглядит следующим образом:
$obj|Add-Member -MemberType NoteProperty -Name Client_DNS -value (If ($obj.Client_IP -ne "0.0.0.0") {(NSLOOKUP $obj.Client_IP|Select-String Name).Line.ToString().Replace(" ","").Split(":")[1]} else {""})
я получаю:
If : The term 'If' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At K:\CodeSnippets\PowerShell\NW_CONN_TO_CSV.ps1:21 char:91
+ ... NS -value (If ($obj.Client_IP -ne "0.0.0.0") {(NSLOOKUP $obj.Client_IP|Selec ...
+ ~~
+ CategoryInfo : ObjectNotFound: (If:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Я уверен, что я мог заставить его работать как две отдельные строки кода, так что оператор If и поместить результат в переменной, а затем использовать эту переменную в качестве значения в команде надстройку член , но я уверен, что то, что я пытаюсь сделать, в высшей степени возможно, я просто что-то пропустил!
Любые идеи?
Отлично! Изменена эта строка в моем коде на '$ obj | Add-Member -MemberType ScriptProperty -Name Client_DNS -value {(NSLOOKUP $ obj.Client_IP | Select-String Name) .Line.ToString(). Заменить (" "," ") .Split (":") [1]} 'и он отлично работает, подавляя ошибку от nslookup, где он не может найти запись DNS для IP-адреса, а затем все еще просматривает мой код, чтобы вытащить только имя dns из результат nslookup. Думаю, мне нужно разобраться с другими типами элементов, поскольку до сих пор я использовал noteproperty. –
Я обнаружил, что мне пришлось изменить 'NSLOOKUP $ obj.Client_IP' на' NSLOOKUP $ this.Client_IP', иначе столбец Client_IP в csv, созданный при отправке pipe на export-csv, был пуст, и потребовалось бы возраст. Кроме того, хотя это изменение фиксирует выход, кажется, что уходит возраст - я подозреваю, что он вычисляется по мере заполнения массива, а затем снова вычисляется export-csv! –
В настоящее время я пошел со следующим - не красивым, но работает '$ ErrorActionPreference =" Stop "; $ Client_DNS_V = If ($ obj.Port_State -ne "LISTEN") {Попробовать {(NSLOOKUP $ obj.Client_IP | Select-String Name) .Line.ToString(). Заменить ("", "").Split (":") [1]} Catch {}} else {""}; $ ОшибкаActionPreference = "SilentlyContinue"; $ obj | Add-Member -MemberType NoteProperty -Name Client_DNS -Value $ Client_DNS_V; ' –