首页 > 解决方案 > 变量是数组而不是字符串?

问题描述

我写了这个小脚本,当我测试时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
    }
}

标签: powershell

解决方案


您的代码中有两个错误需要指出 -

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

    cmdlet 在输入字符串和文件中Select-String搜索文本和文本模式。其中的基本类型输出Get-WMIObject Win32_BiosSystem.Management.ManagementBaseObject

    (Get-WMIObject Win32_Bios).Gettype()
    IsPublic IsSerial 名称 BaseType
    -------- -------- ---- --------
    True 真正的 ManagementObject System.Management.ManagementBaseObject
    

    在这种情况下Select-String,您可以使用Select-Object在属性中进行选择,而不是 。因为,Serial Number是您的输入命令返回的属性之一。

  2. $serial = "C000$serial"

    的输出$serial将是这样的:

    序列号
    
    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
        }
    }
    

    或者您可以使用cmdlet-ExpandProperty的参数,例如Select-Object

    $serial = Get-WMIObject Win32_Bios -ComputerName $_.name |
              Select-Object -ExpandProperty SerialNumber
    $serial = "C000$serial"
    

推荐阅读