0

我有一个从 API 返回数据的 Powershell 脚本,只要我只尝试返回一个 $device.realm,它就可以正常工作,但我需要多个领域。我是PS新手。非常感谢这里的任何帮助

这是我的代码 $Output = forEach ($device in $devices) {

    if ($device.realmName -eq 'Archive') {
    [PSCustomObject]@{
        HostName = $device.name
        IPAddress = $device.primaryInterfaceAddress
        Realm = $device.realmName
        SerialNumbers = (($device.dynamicFields  | where { $_.name -EQ "serial number" } | Select-Object -ExpandProperty values) -join "," | out-string).TrimEnd()
        }| Select-Object Hostname,IPAddress,Realm,SerialNumbers | Export-csv C:\temp\Archive.csv  -notype -Append 
        
    }

我需要返回多个 $device.realms,如 if ($device.realmName -eq 'Archive' -and 'Default' -and 'Farms')

一旦我添加了额外的 -and's,每个领域都会被返回,而不仅仅是我需要返回的。

4

1 回答 1

0

我认为这里的问题是您查询的 If 块中的语句($device.realmName -eq 'Archive' -and 'Default' -and 'Farms')
不是,在逻辑评估时“如果设备领域名称是 Archive、Default 或 Farms,则评估 true”。它正在评估 device.realmname 是否为存档,然后仅将示例中的两个 -and 解释为 true,因为它们不是在查询比较,而只是在查询非空字符串的存在。不确定是什么导致它返回所有内容,我必须查看一些更直接的示例才能确定,但​​根据我的经验,当您在指向非空字符串的比较中包含 -or 时最常见,这将使整个陈述真实。

我的建议如下:在这种情况下,使用内置于 powershell 的正则表达式运算符。你可以使用

if($device.realmname -eq 'Archive' -or $Device.realmname -eq 'farm' -or $device.realmname -eq 'Default')

我相信这会返回你正在寻找的东西,但我觉得它有点复杂。我发现,对单个属性进行更复杂的查询最容易通过 -match 执行,通过调用 -match 运算符的方法,它允许您构建一个正则表达式查询语句,该语句可以包含 Or's 或 And's 以及更简单的语法,像这样:

if($Device.realmName -match 'Archive|Farm|Default')
于 2020-07-22T17:52:47.697 回答