我已经导入了CSV文件,并根据数据创建了一个数组。我需要拆分使用split的域名,但是其中一些名称是IP地址,因此也将其拆分。
如何添加一些逻辑以进行常规拆分?但是,如果它是一个类似于IP地址的数字,请忽略并打印它。
下面是我的示例数据,“客户端名称”是我要使用的内容。
$NewCSV = $a | ForEach-Object {
$Record = @{
'Client Name' = $_."Name".Split('.')[0]
'Policy Name' = $_."AgentServerType"
'Backup State' = $_."BackupStatus"
'logon' = $_."LogonAccountTestStatus"
'account' = $_."LogonAccount"
}
New-Object PSObject -Prop $Record
} | Select "Client Name","Policy Name","Backup State","logon","account"
答案 0 :(得分:0)
您可以使用IPAddress.TryParse
method来确定String
是否代表IP地址...
$Record = @{
'Client Name' = if ([IPAddress]::TryParse($_.Name, [Ref] $null)) {
$_.Name
} else {
$_.Name.Split('.')[0]
}
# ...
}
IPAddress
class存在类型加速器,因此我们也无需指定名称空间(即[System.Net.IPAddress]
)。 TryParse
的第二个参数用于返回从第一个参数解析的IPAddress
实例(如果成功)。我们不需要这个IPAddress
实例,因此我们只需传递$null
。
此外,仅是一种风格上的注释,您不需要,并且除非属性名称包含空格,否则通常不使用引号将属性名称括起来(例如$_."AgentServerType"
)。
答案 1 :(得分:0)
代替使用.split()方法,您可以使用
基于RegEx的-split运算符,带有negative lookahead,如果后面跟随数字,则禁止拆分。
BTW $ Record不是必需的。
$NewCSV = $a | ForEach-Object {
New-Object PSObject -Prop @{
'Client Name' =($_.Name -split '\.(?!\d{1,3}(\.|$))')[0]
'Policy Name' = $_.AgentServerType
'Backup State' = $_.BackupStatus
'logon' = $_.LogonAccountTestStatus
'account' = $_.LogonAccount
}
} | Select "Client Name","Policy Name","Backup State",logon,account