主頁 > .NET開發 > Powershell對txt檔案中的IP地址進行排序

Powershell對txt檔案中的IP地址進行排序

2022-05-29 23:28:26 .NET開發

我有一個包含一些 IP 的純文本檔案,如下所示:

194.225.0.0 - 194.225.15.255
194.225.24.0 - 194.225.31.255
62.193.0.0 - 62.193.31.255
195.146.53.128 - 195.146.53.225
217.218.0.0 - 217.219.255.255
195.146.40.0 - 195.146.40.255
85.185.240.128 - 85.185.240.159
78.39.194.0 - 78.39.194.255
78.39.193.192 - 78.39.193.207

我想按 IP 地址對檔案進行排序。我的意思是只有第一部分很重要。

我用谷歌搜索并找到了一些程式,但我想知道這是否可以通過 Powershell 而沒有其他應用程式。

我有這樣的 Linux 方式,但無法在 Windows 中訪問它:

sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 file

更新1

@TheMadTechnician,這是我運行您的命令時的輸出:

85.185.240.128 - 85.185.240.159
195.146.40.0 - 195.146.40.255
78.39.193.192 - 78.39.193.207
78.39.194.0 - 78.39.194.255
217.218.0.0 - 217.219.255.255
194.225.24.0 - 194.225.31.255
194.225.0.0 - 194.225.15.255
195.146.53.128 - 195.146.53.225
62.193.0.0 - 62.193.31.255

uj5u.com熱心網友回復:

一個使用 RegEx-replace 的簡單解決方案:為了使 IP 地址可排序,我們只需在左側填充每個八位位元組,使它們都具有相同的寬度然后一個簡單的字串比較會產生正確的結果。

對于 PS 6 :

Get-Content IpList.txt | Sort-Object {
    $_ -replace '\d ', { $_.Value.PadLeft(3, '0') }
}

對于 PS 5.x:

Get-Content IpList.txt | Sort-Object {
    [regex]::Replace( $_, '\d ', { $args.Value.PadLeft(3, '0') } )
}
  • -replace運算子嘗試在給定字串中查找正則運算式模式的匹配項,并用給定值替換它們。
  • 對于PS 5.x,我們需要不同的語法,因為-replace不支持scriptblock使用 .NETRegex.Replace方法我們可以實作相同的目的。
  • 第一個$_表示文本檔案的當前行。
  • \d 是匹配每個 IP 地址的每個八位位元組的模式。有關詳細說明,請參見regex101中的示例。
  • {}定義一個輸出替換值 的腳本塊
    • 這里$_表示當前匹配(八位位元組)。我們取它的值并在左邊用零填充它,所以每個八位位元組總共是 3 個字符(例如2become00292become 092)。最終 IP 可能看起來像194.225.024.000.

Tuple使用該類的另一種解決方案。它稍長一些,但更簡潔,因為它實際上比較的是數字而不是字串。

Get-Content IpList.txt | Sort-Object {
    # Extract the first 4 numbers from the current line
    [int[]] $octets = [regex]::Matches( $_, '\d ' )[ 0..3 ].Value
    
    # Create and output a tuple that consists of the numbers
    [Tuple]::Create( $octets[0], $octets[1], $octets[2], $octets[3] )  
}
  • 使用[regex]::Matches()我們找到當前行的所有數字。從回傳的MatchCollection我們獲取前四個元素。然后我們使用成員訪問列舉來創建Value每個MatchCollection元素的成員的字串陣列。

  • 通過簡單地將字串陣列分配給具有[int[]]型別約束(ints 陣列)的變數,PowerShell 會自動將字串決議為整數。

  • 排序之所以有效,是因為Tuple實作了IComparable介面,該介面Sort-Object在可用時使用。元組按字典順序排序,正如預期的那樣。

  • 使用動態方法呼叫,我們可以像這樣縮短[Tuple]::Create呼叫(最多可用于 8 個元素1):

     [Tuple]::Create.Invoke( [object[]] $octets )
    

    請注意轉換為[object[]],否則[Tuple]::Create將只使用一個引數呼叫,即$octets陣列。


[1] 實際上大于 8 個元素的元組可以通過創建嵌套元組來創建(為剩余元素創建一個元組并將其存盤在基本元組的最后一個元素中)。一般來說,要做到這一點,它需要遞回或反向回圈,首先創建大多數嵌套元組。

uj5u.com熱心網友回復:

這個答案最初是作為我在另一個答案中的評論發布的

您可以將IP地址從string物件轉換為version物件,“巧合”與IP地址具有相同的格式(由a分隔的4組數字.

Get-Content .\abc.txt | Sort-Object { [System.Version]($_).split("-")[1] }

uj5u.com熱心網友回復:

只要范圍起始地址在第一個八位位元組中不同,MadTechnician 的答案就有效。為了讓它按多個八位位元組排序,它看起來Sort-Object不會按單個回傳的陣列中的連續值排序[ScriptBlock]為此,您需要[ScriptBlock]為每個八位位元組傳遞一個。 Santiago Squarzon 的回答展示了如何在不重復定義四個幾乎相同[ScriptBlock]的 s 的情況下做到這一點。

相反,一個單一的[ScriptBlock]可以將每個八位位元組組合成一個[UInt32]進行排序的。

用于[Math]::Pow()產生可排序的值

Get-Content -Path 'IPv4AddressRanges.txt' |
    Sort-Object -Property {
        # Split each line on a hyphen surrounded by optional whitespace
        $rangeStartAddress = ($_ -split '\s*-\s*')[0]
        # Split the start address on a period and parse the resulting [String]s to [Byte]s
        [Byte[]] $octets = $rangeStartAddress -split '.', 0, 'SimpleMatch'

        #TODO: Handle $octets.Length -ne 4
        # Alternative: [Byte[]] $octets = [IPAddress]::Parse($rangeStartAddress).GetAddressBytes()

        [UInt32] $sortValue = 0
        # $sortValue = (256 ^ 3) * $octets[0]   (256 ^ 2) * $octets[1]   256 * $octets[2]   $octets[3]
        for ($i = 0; $i -lt $octets.Length; $i  )
        {
            $octetScale = [Math]::Pow(256, $octets.Length - $i - 1)
            $sortValue  = $octetScale * $octets[$i]
        }

        return $sortValue
    }

...輸出...

62.193.0.0 - 62.193.31.255
78.39.193.192 - 78.39.193.207
78.39.194.0 - 78.39.194.255
85.185.240.128 - 85.185.240.159
194.225.0.0 - 194.225.15.255
194.225.24.0 - 194.225.31.255
195.146.40.0 - 195.146.40.255
195.146.53.128 - 195.146.53.225
217.218.0.0 - 217.219.255.255

為了更好地衡量,您可以將第一行更改為...

@('255.255.255.255', '0.0.0.0')   (Get-Content -Path 'IPv4AddressRanges.txt') |

...并看到它正確排序而沒有排序值溢位。

用于[BitConverter]產生可排序的值

您可以通過使用[BitConverter]該類將 IP 地址位元組直接轉換為[UInt32]...

Get-Content -Path 'IPv4AddressRanges.txt' |
    Sort-Object -Property {
        # Split each line on a hyphen surrounded by optional whitespace
        $rangeStartAddress = ($_ -split '\s*-\s*')[0]
        # Split the start address on a period and parse the resulting [String]s to [Byte]s
        [Byte[]] $octets = $rangeStartAddress -split '.', 0, 'SimpleMatch'

        #TODO: Handle $octets.Length -ne 4
        # Alternative: [Byte[]] $octets = [IPAddress]::Parse($rangeStartAddress).GetAddressBytes()

        # [IPAddress]::NetworkToHostOrder() doesn't have an overload for [UInt32]
        if ([BitConverter]::IsLittleEndian)
        {
            [Array]::Reverse($octets)
        }

        return [BitConverter]::ToUInt32($octets, 0)
    }

在 PowerShell 類中實作[IComparable]以定義自己的排序

更復雜的解決方案是將我們的地址存盤在實作[IComparable]介面的型別中,以便Sort-Object可以直接對地址進行排序,而無需指定[ScriptBlock]. [IPAddress]當然,它是存盤 IP 地址的最自然的 .NET 型別,但它不實作任何排序介面。相反,我們可以使用PowerShell 類來實作我們自己的可排序型別......

# Implement System.IComparable[Object] instead of System.IComparable[IPAddressRange]
# because PowerShell does not allow self-referential base type specifications.
# Sort-Object seems to only use the non-generic interface, anyways.
class IPAddressRange : Object, System.IComparable, System.IComparable[Object]
{
    [IPAddress] $StartAddress
    [IPAddress] $EndAddress

    IPAddressRange([IPAddress] $startAddress, [IPAddress] $endAddress)
    {
        #TODO: Ensure $startAddress and $endAddress are non-$null
        #TODO: Ensure the AddressFamily property of both $startAddress and
        #      $endAddress is [System.Net.Sockets.AddressFamily]::InterNetwork
        #TODO: Handle $startAddress -gt $endAddress

        $this.StartAddress = $startAddress
        $this.EndAddress = $endAddress
    }

    [Int32] CompareTo([Object] $other)
    {
        if ($null -eq $other)
        {
            return 1
        }

        if ($other -isnot [IPAddressRange])
        {
            throw [System.ArgumentOutOfRangeException]::new(
                'other',
                "Comparison against type ""$($other.GetType().FullName)"" is not supported."
            )
        }
        
        $result = [IPAddressRange]::CompareAddresses($this.StartAddress, $other.StartAddress)
        if ($result -eq 0)
        {
            $result = [IPAddressRange]::CompareAddresses($this.EndAddress, $other.EndAddress)
        }

        return $result
    }

    hidden static [Int32] CompareAddresses([IPAddress] $x, [IPAddress] $y)
    {
        $xBytes = $x.GetAddressBytes()
        $yBytes = $y.GetAddressBytes()

        for ($i = 0; $i -lt 4; $i  )
        {
            $result = $xBytes[$i].CompareTo($yBytes[$i])
            if ($result -ne 0)
            {
                return $result
            }
        }

        return 0
    }
}

[IPAddressRange]型別存盤范圍的開始地址和結束地址,因此它可以表示輸入檔案的整行。CompareTo方法StartAddress逐位元組比較每個位元組,只有當它們相等時,它才會逐位元組比較每個EndAddress位元組。執行這個...

(
    '127.0.0.101 - 127.0.0.199',
    '127.0.0.200 - 127.0.0.200',
    '127.0.0.100 - 127.0.0.200',
    '127.0.0.100 - 127.0.0.101',
    '127.0.0.199 - 127.0.0.200',
    '127.0.0.100 - 127.0.0.199',
    '127.0.0.100 - 127.0.0.100',
    '127.0.0.101 - 127.0.0.200'
)   (Get-Content -Path 'IPv4AddressRanges.txt') |
    ForEach-Object -Process {
        $startAddress, $endAddress = [IPAddress[]] ($_ -split '\s*-\s*')

        return [IPAddressRange]::new($startAddress, $endAddress)
    } |
    Sort-Object

...按127.0.0.*預期順序對范圍進行排序...

StartAddress   EndAddress     
------------   ----------
62.193.0.0     62.193.31.255
78.39.193.192  78.39.193.207
78.39.194.0    78.39.194.255
85.185.240.128 85.185.240.159
127.0.0.100    127.0.0.100    
127.0.0.100    127.0.0.101
127.0.0.100    127.0.0.199
127.0.0.100    127.0.0.200
127.0.0.101    127.0.0.199
127.0.0.101    127.0.0.200
127.0.0.199    127.0.0.200
127.0.0.200    127.0.0.200
194.225.0.0    194.225.15.255
194.225.24.0   194.225.31.255
195.146.40.0   195.146.40.255
195.146.53.128 195.146.53.225
217.218.0.0    217.219.255.255

請注意,我們只添加了對實體Sort-Object進行排序的功能,[IPAddressRange]而不是它的各個屬性。這些仍然是[IPAddress]不提供自己的排序的型別,所以如果我們嘗試類似的東西... | Sort-Object -Property 'EndAddress'不會產生預期的結果。

uj5u.com熱心網友回復:

一種簡單的方法是在 上分割每一行.,取第一部分(范圍內每個 IP 的第一個八位位元組),然后將其轉換為整數并對其進行排序。

Get-Content .\MyFile.txt | Sort-Object {$_.Split('.')[0] -as [int]}

uj5u.com熱心網友回復:

scottwang提供了一種巧妙的方法來對評論中的 IP 進行排序,使用實作Interface的VersionClassIComparable

這是另一種選擇,顯然效率較低,使用哈希表IPAddress和運算式陣列:

$ips = Get-Content ipfile.txt

$iptable = @{}
foreach($line in $ips) {
    if($ip = $line -replace ' -. ' -as [ipaddress]) {
        $iptable[$line] = $ip.GetAddressBytes()
    }
}

$expressions = foreach($i in 0..3) {
    { $iptable[$_] | Select-Object -Index $i }.GetNewClosure()
}

$ips | Sort-Object $expressions -Descending

使用高級函式匿名函式可以在單個管道中執行相同操作

Get-Content ipfile.txt | & {
    begin {
        $iptable = @{}
        $expressions = foreach($i in 0..3) {
            { $iptable[$_] | Select-Object -Index $i }.GetNewClosure()
        }
    }
    process {
        if ($ip = $_ -replace ' -. ' -as [ipaddress]) {
            $iptable[$_] = $ip.GetAddressBytes()
        }
    }
    end { $iptable.PSBase.Keys | Sort-Object $expressions -Descending }
}

uj5u.com熱心網友回復:

之前的回答效率很低,因此我決定使用實作介面并持有以下實體的提供另一種選擇IComparableIpAddress

class IpComparer : IComparable {
    [ipaddress] $IpAddress

    IpComparer ([string] $IpAddress) {
        $this.IPAddress = $IpAddress
    }

    [int] GetHashCode() {
        return $this.IpAddress.GetHashCode()
    }

    [string] ToString() {
        return $this.IpAddress.ToString()
    }

    hidden static [bool] Equals ([object] $LHS, [object] $RHS) {
        return $LHS.IpAddress -eq $RHS.IpAddress
    }
    [bool] Equals ([object] $Ip) {
        return [IpComparer]::Equals([IpComparer] $this, [IpComparer] $Ip)
    }

    hidden static [int] CompareTo ([IpComparer] $LHS, [IpComparer] $RHS) {
        $x = $LHS.IpAddress.GetAddressBytes()
        $y = $RHS.IpAddress.GetAddressBytes()

        for($i = 0; $i -lt 4; $i  ) {
            if($ne = $x[$i].CompareTo($y[$i])) {
                return $ne
            }
        }
        return 0
    }
    [int] CompareTo ([object] $Ip) {
        if($null -eq $Ip) {
            return 1
        }
        return [IpComparer]::CompareTo([IpComparer] $this, [IpComparer] $Ip)
    }
}

現在實體可以是Comparable

[IpComparer] '194.225.0.0' -lt '194.225.15.255'  # => True
[IpComparer] '194.225.15.255' -lt '194.225.0.0'  # => False
[IpComparer] '194.225.0.0' -gt '194.225.15.255'  # => False
[IpComparer] '194.225.15.255' -gt '194.225.0.0'  # => True

平等測驗

[IpComparer] '194.225.15.25' -ge '194.225.15.25' # => True
'194.225.15.25' -le [IpComparer] '194.225.15.25' # => True

$hs = [Collections.Generic.HashSet[IpComparer]]::new()
$hs.Add('194.225.0.0') # => True
$hs.Add('194.225.0.0') # => False

([IpComparer[]]('194.225.0.0', '194.225.0.0') | Select-Object -Unique).Count # => 1
([IpComparer] '194.225.15.255').Equals('194.225.15.255') # => True

因此,Sortable

Get-Content ipfile.txt | Sort-Object { $_ -replace ' -. ' -as [IpComparer] } -Descending

uj5u.com熱心網友回復:

可能是這樣的。

  Get-Content .\abc.txt |ForEach-Object {($_).split("-")[1]}|Sort-Object

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/482212.html

標籤:电源外壳 排序 IP地址 powershell-5.1

上一篇:如何使用c中的系統呼叫根據當前目錄的大小以升序顯示檔案名?

下一篇:根據以下通用規則對2個串列串列進行排序

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more