2016-05-10 2 views
1

Я пишу скрипт, который берет неструктурированный ввод, переформатирует его и выплевывает 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 и поместить результат в переменной, а затем использовать эту переменную в качестве значения в команде надстройку член , но я уверен, что то, что я пытаюсь сделать, в высшей степени возможно, я просто что-то пропустил!

Любые идеи?

ответ

4

Вы заинтересованы в ScriptProperty, а не NoteProperty:

$obj |Add-Member -MemberType ScriptProperty -Name Client_DNS -Value { 
    nslookup $this.Client_IP |Select-String Name 
} 
+0

Отлично! Изменена эта строка в моем коде на '$ 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. –

+0

Я обнаружил, что мне пришлось изменить 'NSLOOKUP $ obj.Client_IP' на' NSLOOKUP $ this.Client_IP', иначе столбец Client_IP в csv, созданный при отправке pipe на export-csv, был пуст, и потребовалось бы возраст. Кроме того, хотя это изменение фиксирует выход, кажется, что уходит возраст - я подозреваю, что он вычисляется по мере заполнения массива, а затем снова вычисляется export-csv! –

+0

В настоящее время я пошел со следующим - не красивым, но работает '$ 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; ' –

0

Вы можете использовать регулярное выражение для извлечения имя, что-то вроде этого:

$outfile = $srcdata -split "[\r\n]" | % { 
    $v = $_.Split(",") 
    $re = [regex]::match((NSLOOKUP $v[5]), '(?<=Name:\s+)[^\s]+') 

    New-Object psobject -Property @{ 
     Client_DNS = @('', $re.value)[$re.success] 
     Connection_ID = $v[0] 
     Filename = $v[1] 
     MCP_Port = $v[2] 
     Client_Port = $v[3] 
     Port_State = $v[4] 
     Client_IP = $v[5] 
     Protocol_Stack = $v[6] 
    } 
} 
+0

Это работает - проблема в том, что я не понимаю, как это сделать! В частности, где заселяются $ z и $ x? –

+0

Извините опечатки, обновил свой ответ. –

Смежные вопросы