Foreach未处理每一项,而是尝试将全部处理为一行

时间:2019-03-22 17:54:18

标签: powershell foreach

我正在构建一个脚本来提取计算机的mac地址,并将其转换为GUID,然后查询到AD,以找到匹配项并检索与该GUID关联的主机名。

我所读到的有关“ Foreach”的所有信息都表明我正在使用“ SHOULD”的代码。

$NIC = Get-WMIObject Win32_NetworkAdapterConfiguration | select MacAddress
$NICMacs = $NIC.MacAddress

Foreach ($NICMac in $NICMacs)
{

$MacString = $NICMacs -replace ":", ""
$MactoGUID = "00000000000000000000" + $MacString
$MactoGUID = $MactoGUID -replace " ", ''
$NBG = [GUID]$MactoGUID
$CompDetails = Get-ADComputer -Filter 'netbootGUID -like $NBG' -Properties netBootGUID -Server our.AD.server.ca -Credential $sessionKey

这应该处理找到的每个mac地址,除去:字符并添加20个“ 0”,然后转换为GUID格式并查询AD是否匹配。 取而代之的是,它使用找到的所有mac地址,将它们连接到一行,然后尝试使用所有这些数字进行处理。当然,AD将其拒绝为不正确的GUID。 如果我仅使用1个mac地址使用相同的代码,则其格式正确。

2 个答案:

答案 0 :(得分:0)

您的某些步骤可以合并,从而使用节省中间变量

  • Select-Object -ExpandProperty MacAddress
  • .PadLeft()方法

正如@RobV在他的评论中已经指出的,使用错误的var导致了故障。

Foreach ($NICMac in (Get-WMIObject Win32_NetworkAdapterConfiguration |
                       Where-Object MacAddress -ne '' |
                       Select-Object -ExpandProperty MacAddress) ) {
    $NBG = [GUID]($NICMac -replace ':').PadLeft(32,'0')
    $CompDetails = Get-ADComputer -Filter 'netbootGUID -like $NBG' `
      -Properties netBootGUID -Server our.AD.server.ca -Credential $sessionKey
}

我不认为使用深奥的续行字符,
在这里,可以保留概述。

我同意Natural Line Continuations in PowerShell是可取的。

答案 1 :(得分:0)

这里有几个项目:

  1. 在代码的第7行中,您引用了$ NICMacs,但是您应该引用$ NICMacs,因为foreach是通过逻辑而不是成批运行的。
  2. 您可以至少将前两行简化为没有管道的单行。
$NICMacs = (Get-WMIObject Win32_NetworkAdapterConfiguration).MacAddress

Foreach ($NICMac in $NICMacs)
{

$MacString = $NICMac -replace ":", ""
$MactoGUID = "00000000000000000000" + $MacString
[GUID]$NBG = $MactoGUID -replace " ", ''
$CompDetails = Get-ADComputer -Filter 'netbootGUID -like $NBG' -Properties netBootGUID -Server our.AD.server.ca -Credential $sessionKey

编辑:在我建议的代码中,我认为制作$ NBG应该与前面的[GUID]标签一起使用,但我从未尝试过