我可以从MySql查询(例如)填充数据表$ devices:
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作为数据表;仅修改/处理“mac”列的值为:00-00-00-00-00-00文本格式,永久。
答案 0 :(得分:1)
为了清楚一些读者:在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-hart的回答),而不是用子串函数切断mac地址。有人可以改进正则表达式,这样就不必修剪尾随的" - "最后。
对于"几百个"这应该是相当快的。你提到的行。
请注意,对于奖励积分,' ip' column被转换为[System.Net.IPAddress]类型,其中包含一个ToString()方法,用于返回我们通常看到它们的点缀格式的地址。我认为这是过度的,所以你可能想要这个是一个[System.String]。
最后,如果您确实希望MAC-Address列成为NoteProperty,那么我将New-Object
cmdlet中的属性列表中的该列排除并使用Add-Member
。您可以将New-Object
的输出分配给变量,然后将其传递给Add-Member
,或者只是尝试一次性执行,New-Object
的输出流水线为{{ 1}}:
Add-Member
答案 1 :(得分:1)
使用Select-Object,它应该在Powershell中将DataRow / DataTable自动转换为PSCustomObject。以下是我将运行转换为PSCustomObject并在一行中处理MAC地址格式的操作。这可以应用于特定索引处的单个行(如示例代码)或整个DataTable以转换为PSObject数组。
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
答案 2 :(得分:0)
您只需使用表达式列将MAC列的格式化版本添加到数据表对象即可。编写表达式可能有一种更优雅的方式,但这样可行(我假设$ devices是一个DataTable):
ct.addElement(p1);
ct.addElement(p2);
ct.addElement(p3);