当我们在脚本中编写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
正在对当前目录中的文件和文件夹进行排序。这似乎与你的要求不符,我既不会说西班牙语,也没有试图翻译它,所以如果这是你想要做的,我将由你来判断。