为了让您了解 PowerShell 中的一些一般概念,我尝试在下面回答您的每个特定(子)问题:
“如何遍历来自PowerShell的CSV数据?”也许会
成为备用问题标题。
PowerShell 中的大多数cmdlets 都使用PowerShell Pipeline。 Foreach-Object 是一个原生对象,用于遍历管道中的每个对象(行),其中 $_ is the current object 和 Region 是一个示例属性:
PS C:\> $Flat | Foreach-Object { $_.Region }
BC
Fraser
Interior
Northern
Unknown
Vancouver Coastal
Vancouver Island
您也可以使用Foreachmethod 来遍历对象:
PS C:\> $Flat.Foreach{ $_.Region }
BC
Fraser
Interior
Northern
Unknown
Vancouver Coastal
Vancouver Island
但我会更感兴趣,例如,基本的SQL:
SELECT * FROM $flat limit 3
SQL命令SELECT * FROM $flat limit 3的PowerShell补充,
将是Select-Object cmdlet:
PS C:\> $Flat | Select-Object * -First 3
Date : 2020-01-23
Region : BC
New_Tests : 2
Total_Tests : 2
Positivity : 0
Turn_Around : 32
Date : 2020-01-23
Region : Fraser
New_Tests : 0
Total_Tests : 0
Positivity : 0
Turn_Around : 0
Date : 2020-01-23
Region : Interior
New_Tests : 0
Total_Tests : 0
Positivity : 0
Turn_Around : 0
或使用WHERE 子句。甚至可能只是返回行/记录n?
要选择特定对象(行),您可以使用Select-Object -Index <index> Parameter:
PS C:\> $Flat | Select-Object -Index 3
Date : 2020-01-23
Region : Northern
New_Tests : 0
Total_Tests : 0
Positivity : 0
Turn_Around : 0
或者直接index into the object array:
PS C:\> $Flat[3]
Date : 2020-01-23
Region : Northern
New_Tests : 0
Total_Tests : 0
Positivity : 0
Turn_Around : 0
要查找具有特定属性的对象,您可以使用 Where-Object cmdlet:
PS C:\> $Flat | Where-Object Turn_Around -eq 32
Date : 2020-01-23
Region : BC
New_Tests : 2
Total_Tests : 2
Positivity : 0
Turn_Around : 32
Date : 2020-01-23
Region : Vancouver Coastal
New_Tests : 2
Total_Tests : 2
Positivity : 0
Turn_Around : 32
或者Where方法:
PS C:\> $Flat.Where{ $_.Turn_Around -eq 32 }
Date : 2020-01-23
Region : BC
New_Tests : 2
Total_Tests : 2
Positivity : 0
Turn_Around : 32
Date : 2020-01-23
Region : Vancouver Coastal
New_Tests : 2
Total_Tests : 2
Positivity : 0
Turn_Around : 32
要选择特定属性(列),您可以使用Select-Object -ExpandProperty <property> 参数:
PS C:\> $Flat | Select-Object -ExpandProperty Region
BC
Fraser
Interior
Northern
Unknown
Vancouver Coastal
Vancouver Island
或使用Member Enumeration 功能:
PS C:\> $Flat.Region
BC
Fraser
Interior
Northern
Unknown
Vancouver Coastal
Vancouver Island
最好represented为:
大多数 cmdlet 默认将结果输出到管道(请参阅:Write-Output)。如果命令是管道中的最后一个命令,则对象将显示在控制台中。 PowerShell 使用默认格式化程序来定义对象类型的显示方式,但您可以使用格式化 cmdlet,例如Format-Table 和 Format-List,以您自己的方式格式化输出到控制台:
PS C:\> $Flat | Select-Object * -First 3 | Format-Table
Date Region New_Tests Total_Tests Positivity Turn_Around
---- ------ --------- ----------- ---------- -----------
2020-01-23 BC 2 2 0 32
2020-01-23 Fraser 0 0 0 0
2020-01-23 Interior 0 0 0 0
我认为perhaps、fields 或 properties 属于通用 Object。
在 PowerShell 中,它们称为 Properties,属于特定对象。
要列出对象的属性和方法,您可以使用 Get-Member cmdlet:
PS C:\> $Flat | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Date NoteProperty string Date=2020-01-23
New_Tests NoteProperty string New_Tests=2
Positivity NoteProperty string Positivity=0
Region NoteProperty string Region=BC
Total_Tests NoteProperty string Total_Tests=2
Turn_Around NoteProperty string Turn_Around=32
如何将Linux 上的Powershell 中的一行从CSV 映射到Object?
Import-Csv ./Flat.csv | ... (e.g. Where-Object ... or Select-Object ..) | ...
您没有使用 Join 这个词,但是如果您正在寻找一种方法将对象列表(来自 csv 文件)与另一个对象列表(驻留在 PowerShell 中)基于相关属性,您可能需要检查此外部 Join-Object cmdlet(另请参阅:In Powershell, what's the best way to join two tables into one?)
请注意,PowerShell Core 基于 .Net Core 框架,两者都旨在跨平台。这意味着在支持 PowerShell Core 的任何操作系统之间选择对象和属性(映射)基本上没有区别。