对TCP或UDP协议进行分组,并在PowerShell中按字符号对其进行排序



当我们在脚本中编写TCP或UDP协议时,我需要在powershell中制作一个菜单,对它们进行分组。此外,我还需要菜单中的可能性来按字符编号排序。目前我已经这样做了,但它有很多错误。抱歉使用西班牙语的变量名称和文本:(

function mostrarMenu 
{ 
param ( 
[string]$Titulo = 'Ejercicio 4' 
) 
cls 
Write-Host "================ $Titulo================" 


Write-Host "1) Agrupar por protocolo" 
Write-Host "2) Ordenarlos" 
Write-Host "S) Presiona 'S' para salir"
}
do
{ 
mostrarMenu 
$input = Read-Host "En este ejercicio podremos contar los servicios de etcservices. Elige una opcion" 
switch ($input) 
{ 
'1' { 
cls 
$elige = Read-Host "Pon TCP o UDP"
Get-Content -Path "C:WindowsSystem32driversetcservices" | 
Select-String -Pattern $elige | Group-Object -Property {$_ -like "*$elige*"}
} '2' { 
cls 
get-childitem | sort-object -property length
} 's' { 
return 
}  
} 
pause 
} 
until ($input -eq 's')

您可以执行以下操作,按协议分组,然后按服务名称长度应用排序:

(Get-Content C:WindowsSystem32driversetcservices) -notmatch '^#' -ne '' |
Group-Object { $_ -replace '^.*d+/(w{3}).*$','$1'} | Foreach-Object {
$_.Group | Sort-Object {
($_ -replace 's+d+/w{3}.*$').Length
}
}

-notmatch '^#' -ne ''从输出中删除空行和注释行。

^.*d+/(w{3}).*$匹配包含PortNumber/Protocol格式的每一行。匹配行上的所有内容都被替换。捕获组1是协议。匹配的文本仅被协议$1替换。分组基于该值进行。

s+d+/w{3}.*$匹配服务名称之后的所有内容。匹配的文本将被替换。然后对剩余的服务名称进行排序。

我不确定出了什么问题?

您的线路

Get-Content -Path "C:WindowsSystem32driversetcservices" | 
Select-String -Pattern $elige | Group-Object -Property {$_ -like "*$elige*"}

运行时将所有相同的协议(我认为elige是西班牙语中的协议(很好地分组在一起(除非行中的其他地方出现相同的字符(。结果是一个对象,其Group属性包含所有相应行的数组。

也许你的意思是先分组?听起来你可能想按协议将它们分组,然后在组中按名称的字母顺序排序?

$groupedContent = Get-Content -Path "C:WindowsSystem32driversetcservices" | # content line-by-line
ForEach-Object {
$newline = $_ -split ' ' | ForEach-Object Trim | Where-Object {$_} # convert line into an array
Write-Output $newline -NoEnumerate
} |
Sort-Object {$_[0]} | # sort by name
Group-Object {($_[1] -split '/')[-1]} # group by protocol
# retrieve chosen protocol (tcp or udp)
$groupedContent | Where-Object Name -EQ $elige | Select-Object -ExpandProperty Group

我还想指出,get-childitem | sort-object -property length正在对当前目录中的文件和文件夹进行排序。这似乎与你的要求不符,我既不会说西班牙语,也没有试图翻译它,所以如果这是你想要做的,我将由你来判断。

最新更新