Как вы обнаружили, $NMapObj$k
не работает - синтаксис ссылок на переменные PowerShell не поддерживает переменные переменные (например, PHP)
Я бы предложите использовать список для сбора объектов:
$listOfObjects = New-Object 'System.Collections.Generic.List[psobject]'
$obj = New-Object psobject
$obj |Add-Member ...
$listOfObjects.Add($obj)
Затем в конце вашей функции:
return $listOfObjects
PowerShell затем перечислит список, и цель назначения получит массив объекты в списке
Еще одно решение PowerShell-idiomati c состоит в том, чтобы просто выдавать каждый настраиваемый объект, как вы go!
Для показанного вами входного образца вы можете написать простой синтаксический анализатор с switch
, как это:
function Parse-NMapReport
{
param(
[string]$Path
)
$IP = ""
switch -File $path -Regex {
'Nmap scan report for (?<ip>[\d\.]+)' {
if($IP){
# Defining the object without assigning it to anything
# This will make the object "bubble up" back to the caller
[PSCustomObject]@{
IP = $IP
Ports = $Ports
}
}
$IP = $Matches['ip']
$Ports = @()
}
'^(?<port>\d+)/tcp' {
$Ports += ($Matches['port'] -as [int])
}
}
if($IP){
[PSCustomObject]@{
IP = $IP
Ports = $Ports
}
}
}
Теперь вы можете сделать:
PS C:\> $results = Parse-NMapReport -Path ".\Path\to\nmap.txt"
И $results
будет массивом созданных настраиваемых объектов:
PS C:\> $results
IP Ports
-- -----
11.1.1.11 {21, 49, 67, 111…}
2.2.22.2 {21, 67, 111, 123…}