2015-09-23 50 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