Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 创建自定义对象数组Powershell_Windows_Powershell_Object - Fatal编程技术网

Windows 创建自定义对象数组Powershell

Windows 创建自定义对象数组Powershell,windows,powershell,object,Windows,Powershell,Object,我有一个包含TXT的数据文件。 我正在构建一个函数来迭代该数据文件,并根据该文件构建自定义对象。最后,我希望函数返回这些自定义对象的数组。 以下是一个对象及其外观的示例: $NmapOBJ1 = New-Object PSObject $NmapOBJ1 | Add-Member -type NoteProperty -name "IP" -Value "192.168.10.10" $ports = @(22,80,435) $NmapOBJ1 | Ad

我有一个包含TXT的数据文件。 我正在构建一个函数来迭代该数据文件,并根据该文件构建自定义对象。最后,我希望函数返回这些自定义对象的数组。 以下是一个对象及其外观的示例:

$NmapOBJ1 = New-Object PSObject
$NmapOBJ1 | Add-Member -type NoteProperty -name "IP" -Value "192.168.10.10"
$ports = @(22,80,435)
$NmapOBJ1 | Add-Member -type NoteProperty -name "Ports" -Value $ports
每个对象都有可用的IP和端口, 现在我正在创建一个循环,我想要一个像$k=0这样的变量,每次循环重新运行时它都会得到$k++。 因此,一次生成$nmapbj1,然后生成$nmapbj2,$nmapbj3。。 但我不能使用:

$k=0
$NmapOBJ$k = New-Object PSObject
因为我将得到错误:表达式或语句中出现意外标记“$k”。 提前谢谢

***编辑*** txt文件的示例可以是:

Nmap scan report for 11.1.1.11
21/tcp  filtered ftp
49/tcp  filtered tacacs
67/tcp  open     tcpwrapped
111/tcp filtered rpcbind
121/tcp filtered rpcbind
123/tcp filtered ntp
179/tcp filtered bgp
646/tcp filtered ldp
Nmap scan report for 2.2.22.2
21/tcp    filtered ftp
67/tcp    open     tcpwrapped
111/tcp   filtered rpcbind
123/tcp   filtered ntp
179/tcp   filtered bgp
646/tcp   filtered ldp
33012/tcp filtered unknown
然后我想要一个object1.ip=11.1.1.11;object1.ports=@(21,49,67111121123179646)


依此类推。

正如您发现的那样,
$NMapObj$k
不起作用-PowerShell的变量引用语法不支持变量(例如在PHP中)

我建议使用列表来收集对象:

$listOfObjects=新对象'System.Collections.Generic.List[psobject]'
$obj=新对象psobject
$obj |添加成员。。。
$listOfObjects.Add($obj)
然后在函数结束时:

返回$listofObject
PowerShell随后将枚举列表,分配目标将接收列表中的对象数组


这里更具PowerShell特色的解决方案是,只需在运行时发出每个自定义对象

对于您所展示的输入示例,您可以编写一个简单的解析器,其中包含一个
switch
语句,如下所示:

函数解析
{
param(
[字符串]$Path
)
$IP=“”
开关-File$path-Regex{
'的Nmap扫描报告(?[\d\.]+)'{
若有($IP){
#定义对象而不将其指定给任何对象
#这将使对象“冒泡”回到调用方
[PSCustomObject]@{
IP=$IP
端口=$Ports
}
}
$IP=$Matches['IP']
$Ports=@()
}
“^(?\d+)/tcp”{
$Ports+=($Matches['port']-as[int])
}
}
若有($IP){
[PSCustomObject]@{
IP=$IP
端口=$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…}

与其尝试创建新变量,不如从该文件中获取PSObject数组

像这样的方法应该会奏效:

# read the text file as single string and split it into n textblocks. Remove empty blocks
$result = (Get-Content -Path 'D:\Test\NmapScanReport.txt' -Raw) -split 'Nmap.+for\s*' | 
            Where-Object { $_ -match '\S'} | 
            ForEach-Object {
                # split each textblock into separate lines
                $lines = $_ -split '\r?\n'
                # and output an object with properties IP and Ports (the latter is an array)
                [PsCustomObject]@{
                    IP    = $lines[0].Trim()
                    Ports = for ($i = 1; $i -lt $lines.Count; $i++) { ($lines[$i] -split '/')[0] }
                }
            }

# output on screen
$result

# write to csv file
$result | Export-Csv -Path 'D:\Test\IpAndPorts.csv' -NoTypeInformation
屏幕上的输出:

IP Ports -- ----- 11.1.1.11 {21, 49, 67, 111...} 2.2.22.2 {21, 67, 111, 123...} IP端口 -- ----- 11.1.1.11 {21, 49, 67, 111...} 2.2.22.2 {21, 67, 111, 123...}
$obj|添加成员…->我可以用这一行添加带有值的属性IP和带有端口号数组的属性吗?这只是一个示例,替换为任何数量的
addmember
呼叫您need@Shahar更新了答案,以显示创建新对象的更简单方法(尽管这不适用于PowerShell 2.0,仅适用于3.0及更新版本)