Mysql 将Datatable转换/处理为自定义PSObject的最快方法

Mysql 将Datatable转换/处理为自定义PSObject的最快方法,mysql,powershell,datatable,object,psobject,Mysql,Powershell,Datatable,Object,Psobject,我能够通过MySql查询填充datatable$devices(例如): 我想将该数据表类型转换为自定义PSObject;其中,mac列转换为PSObject NoteProperty名称“mac地址”;和,分别转换为00-00-00-00字符串格式的值: PS C:\Users\MKANET\Desktop\dev\lab> $devices[1] name ip

我能够通过MySql查询填充datatable$devices(例如):

我想将该数据表类型转换为自定义PSObject;其中,mac列转换为PSObject NoteProperty名称“mac地址”;和,分别转换为00-00-00-00字符串格式的值:

PS C:\Users\MKANET\Desktop\dev\lab> $devices[1]

name                               ip                                      MAC-Address                             vendor
-------                            --                                      -----------                             ------------
ComputerTest                       10.51.18.6                              fd-19-69-ff-4c-b9                       HewlettP
考虑到这些数据表可能相对较大(可能有几百行),我需要在Powershell中使用最快的处理方法来完成此操作。


如果它能显著加快转换/修改过程,我很乐意将$Devices作为一个数据表;仅将“mac”列的值永久修改/处理为:00-00-00-00-00-00文本格式。

您可以使用表达式列将mac列的格式化版本添加到datatable对象中。可能有一种更优雅的方式来编写表达式,但这是可行的(我假设$devices是一个数据表):


您可以使用表达式列将MAC列的格式化版本添加到datatable对象中。可能有一种更优雅的方式来编写表达式,但这是可行的(我假设$devices是一个数据表):


让一些读者明白一点:在PowerShell中,DataTable是一个PS对象,只是一个具有[System.Data.DataTable]类型的对象。该类型(类)提供了许多操作对象的方法,例如添加新列(如@e-z-hart提供的答案所示)

将一个对象转换为一个通用的“PSObject”实际上意味着剥离与[DataTable]类相关的所有附加方法等,只留下一个简单的对象。您可以按如下方式执行此操作:

$obj = $devices.table[10] | foreach {

  $macaddress = ($_.mac -replace '(..)','$1-').TrimEnd("-")

  New-Object -TypeName PSObject -Property @{
    "name         = [System.String]        $_.name
    "ip"          = [System.Net.IPAddress] $_.ip
    "mac-address" = [System.String]        $macaddress
    "vendor"      = [System.String]        $_.vendor
  }
}
希望用正则表达式替换
-replace
操作符比用子字符串函数分割mac地址更优雅(参见@e-z-hart的答案)。有人可能能够改进正则表达式,这样就不必在末尾修剪尾随的“-”

对于您提到的“几百”行,这应该是相当快的

请注意,对于奖励积分,“ip”列被转换为[System.Net.IPAddress]类型,其中包括一个ToString()方法,以我们通常看到的虚线格式返回地址。我认为这是过分的,所以您可能希望它始终是一个[System.String]

最后,如果您真的希望MAC地址列成为NoteProperty,那么我会将该列从
新建对象
cmdlet的属性列表中排除,并使用
添加成员
。您可以将
New Object
的输出分配给一个变量,然后将其传递给
Add Member
,或者只需将
New Object
的输出管道化到
Add Member
,一次完成即可:

New-Object ... | Add-Member -MemberType NoteProperty -Name "Mac-Address" -Value $macaddress

让一些读者明白一点:在PowerShell中,DataTable是一个PS对象,只是一个具有[System.Data.DataTable]类型的对象。该类型(类)提供了许多操作对象的方法,例如添加新列(如@e-z-hart提供的答案所示)

将一个对象转换为一个通用的“PSObject”实际上意味着剥离与[DataTable]类相关的所有附加方法等,只留下一个简单的对象。您可以按如下方式执行此操作:

$obj = $devices.table[10] | foreach {

  $macaddress = ($_.mac -replace '(..)','$1-').TrimEnd("-")

  New-Object -TypeName PSObject -Property @{
    "name         = [System.String]        $_.name
    "ip"          = [System.Net.IPAddress] $_.ip
    "mac-address" = [System.String]        $macaddress
    "vendor"      = [System.String]        $_.vendor
  }
}
希望用正则表达式替换
-replace
操作符比用子字符串函数分割mac地址更优雅(参见@e-z-hart的答案)。有人可能能够改进正则表达式,这样就不必在末尾修剪尾随的“-”

对于您提到的“几百”行,这应该是相当快的

请注意,对于奖励积分,“ip”列被转换为[System.Net.IPAddress]类型,其中包括一个ToString()方法,以我们通常看到的虚线格式返回地址。我认为这是过分的,所以您可能希望它始终是一个[System.String]

最后,如果您真的希望MAC地址列成为NoteProperty,那么我会将该列从
新建对象
cmdlet的属性列表中排除,并使用
添加成员
。您可以将
New Object
的输出分配给一个变量,然后将其传递给
Add Member
,或者只需将
New Object
的输出管道化到
Add Member
,一次完成即可:

New-Object ... | Add-Member -MemberType NoteProperty -Name "Mac-Address" -Value $macaddress

使用Select Object,它应该在Powershell中将DataRow/DataTable自动转换为PSCustomObject。下面是我将运行以转换为PSCustomObject并在一行中处理MAC地址格式的操作。这可以应用于特定索引处的单行(如示例代码)或整个DataTable,以转换为PSObject数组

MAC地址格式将删除原始文件中的任何非字母数字字符,转换为小写,然后在适当的索引处插入连字符

$devices.table[10]|选择对象名称,ip,@{N=“MAC地址”;E={(($.MAC-replace'[^a-zA-Z0-9],'').ToLower().insert(2,“-”).insert(5,“-”).insert(8,“-”).insert(11,“-”).insert(14,“-”},供应商

使用Select Object,它应该在Powershell中将DataRow/DataTable自动转换为PSCustomObject。下面是我将运行以转换为PSCustomObject并在一行中处理MAC地址格式的操作。这可以应用于特定索引处的单行(如示例代码)或整个DataTable,以转换为PSObject数组

MAC地址格式将删除原始文件中的任何非字母数字字符,转换为小写,然后在适当的索引处插入连字符

$devices.table[10]|选择对象名称,ip,@{N=“MAC地址”;E={(($.MAC-replace'[^a-zA-Z0-9],'').ToLower().insert(2,“-”).insert(5,“-”).insert(8,“-”).insert(11,“-”).insert(14,“-”},供应商