如何在 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
替换为您选择的相关解决方案和其他答案中的变量。
如何在 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
替换为您选择的相关解决方案和其他答案中的变量。