2015-09-23 51 views
0

我能够从一个MySQL查询(例如)填充一个DataTable,$设备最快的方式

PS C:\Users\MKANET\Desktop\dev\lab> $devices.table[10] 

name         ip           mac         vendor 
----         --           ---         ------ 
ComputerTest       10.51.18.6         fd1969ff4cb9       HewlettP 

我想来转换数据表键入一个自定义PSObject;其中,mac列转换为PSObject NoteProperty名称“Mac-Address”;和,各个值转换为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保存为Datatable;只修改/处理“mac”列的值为:00-00-00-00-00-00文本格式,永久

回答

0

您可以使用表达式列将格式化的MAC列添加到数据表对象。有可能要写入的表达更优雅的方式,但是这将工作(我假设$设备是一个DataTable):

$maColumn = $devices.Columns.Add('MAC-Address') 
$maColumn.Expression = "SUBSTRING(mac, 1, 2) + '-' + SUBSTRING(mac, 3, 2) + '-' + SUBSTRING(mac, 5, 2) + '-' + SUBSTRING(mac, 7, 2) + '-' + SUBSTRING(mac, 9, 2) + '-' + SUBSTRING(mac, 11, 2)" 
0

只是为一些读者是清楚的:在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运营商,正则表达式是有点更优雅(来自@ E-Z - 哈特参考答案)不必砍的MAC地址了子功能。有人可能能够改进正则表达式,因此不必修改尾部的“ - ”。

对于您提到的“几百行”行,这应该相当快。请注意,对于奖励积分,'ip'列转换为[System.Net.IPAddress]类型,其中包含一个ToString()方法,以我们通常看到的点状格式返回地址。我想这是矫枉过正,所以你可能希望这是一个[System.String]。

最后,如果你真的的MAC地址栏是一个NoteProperty,那么我会排除在New-Object cmdlet的属性的列表列,并使用Add-Member。你会可以的New-Object输出分配给一个变量,然后传递到Add-Member或只是尝试的New-Object流水线到Add-Member输出做一气呵成:

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

0

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

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

$devices.table[10] | Select-Object name,ip,@{N="MAC-Address";E={((((($_.mac -replace '[^a-zA-Z0-9]','').ToLower().insert(2,"-")).insert(5,"-")).insert(8,"-")).insert(11,"-")).insert(14,"-")}},vendor