在powershell中向数组添加逻辑

Adding logic to array in powershell

我导入了一个 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"

您可以使用 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 的第二个参数用于 return 从第一个参数解析的 IPAddress 实例。我们不需要这个 IPAddress 实例,所以我们只传递 $null

此外,这只是一个文体注释,您不需要并且通常不会用引号将 属性 名称括起来(例如 $_."AgentServerType"),除非 属性 名称包含空格.

您可以使用
而不是使用 .split() 方法 基于 RegEx 的 -split 运算符,带有 negative lookahead 以在数字后跟时禁止拆分。

顺便说一句,$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