Foreach 不会处理每个项目,而是尝试将所有项目处理为一行



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

读到的关于"Foreach"的所有内容都表明我使用的代码"应该"有效。

$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 地址使用相同的代码,则它的格式正确。

您的一些步骤可以组合在一起,从而使用

  • 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
}

我不认为使用行继续字符是深奥的,
在这里,它允许保持概述。

我同意PowerShell中的Natural Line Continuations更可取。

这里有几个项目:

  1. 在代码的第 7 行中,引用$NICMacs,但您应该引用$NICMac因为 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] 标签一起使用,但我从未尝试过

最新更新