如何在 PowerShell 中按列排序?

How can I sort by column in PowerShell?

如何在 PowerShell 中按第 3 列对文本文件进行排序? 这是文件的一部分:

    reza             zabihi          12     1
    maryam           joraee          17     2
    leyla            ahmadi          13     2
    farzin           farahbakhsh     16     1
    keyvan           maleki          8      1
    kaveh            ahangar         18     1
    nooshafarin      bakhtiari       13     2
    roya             afrashteh       13     2
    asghar           nazemi          18     1
    jaleh            nooruzi         16     2
    ali              samadi          6      1
    mohsen           adibi           3      1
    firooz           karimi          7      1
    mostafa          rostamian       18     1
    jafar            omidi           6      1
    shima            zagrosi         12     2
    somayyeh         modaberi        16     2
    shahram          zamani          16     1
    sayeh            rahmati         3      2
    shirin           rahjoo          12     2

我试过了

Get-Content namef | Sort-Object { [double]$_.Split()[-2] } -Descending

这是一种可能的解决方案:

Get-Content yourfile.txt | ForEach-Object {
    $Line = $_.Trim() -Split '\s+'

    New-Object -TypeName PSCustomObject -Property @{
        FirstName = $Line[0]
        LastName = $Line[1]
        FirstValue = [int]$Line[2]
        SecondValue = [int]$Line[3]
    }

} | Sort-Object FirstValue | Format-Table

这使用 Get-Content 加载您的文件,然后使用 ForEach-Object 循环遍历该文件的每一行(其中该行由自动变量 $_ 表示) .

它在行上使用 .Trim() 方法删除尾随空格,然后使用表示一个或多个空格的 RegEx 字符串 \s+ 拆分行。

此后 $Line 现在是一个数组,每个元素不包括空格,因此我们创建一个自定义 PowerShell 对象,我们在其中为每个项目命名并通过 $Line 访问它的对应值数组索引运算符 [0]..[1] 等。我们将值列转换为 [int] 以便稍后对它们进行正确排序(与将它们视为字符串相比)。

现在我们已经输出了一个 PowerShell 对象,我们可以简单地将结果输出到 Sort-Object 和 FirstValue 属性,然后将其发送到 Format-Table 以获得 table结果。

你已经差不多了。您的代码无法按预期方式工作的原因是 Split() 方法在 each space 处拆分字符串,所以您得到了很多的空列。您真正想要的是在 连续 白色 space 处拆分。要执行后者,请使用 -split 运算符:

Get-Content namef | Sort-Object { [double]($_ -split '\s+')[-2] } -Descending

所以您已经有 2 个关于如何获得结果的答案,我添加一个关于如何发送电子邮件的答案,这是您最初要求的一部分。您编辑了问题并将其删除,但我已经完成了大部分答案,所以无论如何我都会发布它。

使用 windows 系统标准的 powershell Send-MailMessage 运行 它在批处理文件中:

注意!! 必须是powershell 2.0 或更高版本。

powershell Send-MailMessage 
           -From "someone@someserver.net"
           -To "whoever@gmail.com"
           -Subject "Test email"
           -Body "This is a test"
           -SmtpServer Some_exhange_server_name

为了便于阅读,我使用换行符分解了上面的文本,但它应该是单行的,如下所示。

Send-MailMessage -From "someone@someserver.net" -To "whoever@gmail.com" -Subject "Test email" -Body "This is a test" -SmtpServer some_exhange_Server_name

您所要做的就是将正文 This is a test 替换为您选择的相关解决方案和其他答案中的变量。