Переменная это массив вместо строки? - PullRequest
0 голосов
/ 21 мая 2018

Я написал этот небольшой скрипт, и когда я тестирую Write-Host $serial, он выглядит нормально, но когда он работает в фоновом режиме, $serial, кажется, содержит массив.

Он пытается переименовать компьютер в C000@{SerialNumber=F7ZL3F2} вместо C000F7ZL3F2.

Что мне нужно сделать, чтобы получить строку, а не этот массив?

Import-Module ActiveDirectory
Get-ADComputer -Filter {Name -like 'DESKTOP-*'} -Properties * | Select Name, DNSHostName | ForEach-Object {
    $rtn = Test-Connection -CN $_.dnshostname -Count 1 -BufferSize 16 -Quiet
    if ($rtn -match 'True') { 
        $serial = Get-WMIObject Win32_Bios -ComputerName $_.name | Select-String SerialNumber
        $serial = "C000$serial"
        // Write-Host $serial
        Rename-Computer -ComputerName $_.name -NewName $serial -DomainCredential $mycreds -Force -Restart
    }
}

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Попробуйте изменить эту строку:

$serial = Get-WMIObject Win32_Bios -ComputerName $_.name |
            Select-String SerialNumber

на эту:

$serial = (Get-WMIObject Win32_Bios -ComputerName $_.name).SerialNumber

или эту:

$serial = Get-WMIObject Win32_Bios -ComputerName $_.name |
           Select-Object -ExpandProperty SerialNumber
0 голосов
/ 21 мая 2018

В вашем коде нужно указать на две ошибки -

  1. $serial = Get-WMIObject Win32_Bios -ComputerName $_.name | Select-String SerialNumber

    Командлет Select-String ищет тексти текстовые шаблоны во входных строках и файлах.Где в качестве базового типа выходное значение Get-WMIObject Win32_Bios равно System.Management.ManagementBaseObject

    (Get-WMIObject Win32_Bios).Gettype()
    IsPublic IsSerial Name             BaseType
    -------- -------- ----             --------
    True     True     ManagementObject System.Management.ManagementBaseObject
    

    В таких случаях вместо Select-String вы можете использовать Select-Object для выбора среди свойств.Поскольку Serial Number является одним из свойств, возвращаемых вашей входной командой.

  2. $serial = "C000$serial"

    Вывод $serial будет выглядеть примерно так:

    SerialNumber
    <hr>
    
    5CXXXXYYYXZZZ
    

    Опять же, вы можете позвонить напрямую по $serial.SerialNumber.Таким образом, ваш общий код будет

    Import-Module ActiveDirectory
    
    Get-ADComputer -Filter {Name -like 'DESKTOP-*'} -Properties * | Select Name, DNSHostName | ForEach-Object {
        $rtn = Test-Connection -CN $_.dnshostname -Count 1 -BufferSize 16 -Quiet
    
        if ($rtn -match 'True') { 
            $serial = Get-WMIObject Win32_Bios -ComputerName $_.name |
                      Select-Object SerialNumber
    
            $serial = "C000$($serial.SerialNumber)"
    
            Rename-Computer -ComputerName $_.name -NewName $serial -DomainCredential $mycreds -Force -Restart
        }
    }
    

    Или вы можете использовать -ExpandProperty параметр командлета Select-Object, например

    $serial = Get-WMIObject Win32_Bios -ComputerName $_.name |
              Select-Object -ExpandProperty SerialNumber
    $serial = "C000$serial"
    
0 голосов
/ 21 мая 2018

Почему вы используете Select-String?Я бы использовал Select-Object, а затем -ExpandProperty

Import-Module ActiveDirectory

Get-ADComputer -Filter {Name -like 'DESKTOP-*'} -Properties * | Select Name, DNSHostName | ForEach-Object {

  $rtn = Test-Connection -CN $_.dnshostname -Count 1 -BufferSize 16 -Quiet

  if ($rtn -match 'True') { 
  $serial = Get-WMIObject Win32_Bios -ComputerName $_.name | Select-Object -ExpandProperty SerialNumber

  $serial = "C000$serial"

  // Write-Host $serial

  Rename-Computer -ComputerName $_.name -NewName $serial -DomainCredential $mycreds -Force -Restart
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...