在Powershell中向阵列添加逻辑

时间:2018-11-17 03:46:46

标签: powershell powershell-v2.0

我已经导入了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"

2 个答案:

答案 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