2017-02-12 3 views
-1

Я извлекаю информацию из базы данных с DNS-именем системы. Как только я получу информацию, я настроил ее, чтобы заменить части имени компьютера, которые я больше не хочу.Невозможно развернуть PSObject

Проблема заключается в том, что после того, как замена выполнена, я больше не могу выбирать объекты - она ​​просто возвращает пробелы, если вы выберете DnsName, или если вы посмотрите на переменную, она просто покажет @{Dnsname=computer123}. Я пробовал -ExpandProperty, но это тоже не работает.

function ExecuteSqlQuery($SQLQuery) { 
    $Server = "localhost" 
    $Database = "DB123" 
    $Array = @() 

    #Create and open a database connection 
    $Connection = New-Object System.Data.SQLClient.SQLConnection 
    $Connection.ConnectionString = "server='$Server';database='$Database';trusted_connection=true;" 
    $Connection.Open() 

    #Create a command object 
    $Command = New-Object System.Data.SQLClient.SQLCommand 
    $Command.Connection = $Connection 
    $Command.CommandText = $SQLQuery 

    #Execute the Command 
    $Reader = $Command.ExecuteReader() 
    $Counter = $Reader.FieldCount 

    #Parse the records 
    while ($Reader.Read()) { 
    for ($i =0; $i -lt $Counter; $i++) { 
     $Array += $Reader.GetValue($i) 
    } 
    } 

    # Close the database connection 
    $Connection.Close() 
    return $Array 
} 

$DNSsys = "SELECT DnsName FROM Systems" 
$DNSName = ExecuteSqlQuery ($DNSsys) 

$DNSName = $DNSName -replace '.123.com', '' -replace '.abc.com', '' 

Я также столкнулся с той же проблемой, когда я тяну информацию из SCCM на код ниже, где все хорошо, пока -replace не запускается:

# Create the PSSession 
$Session = New-PSSession -ComputerName sccmserver 

# Load the CM Module using Implicit Remoting 
Import-Module -Name "C:\Program Files\Microsoft Configuration Manager\AdminConsole\bin\ConfigurationManager.psd1" -PSSession $Session 

#Set the CMSite as our current location to run the CM cmdlets 
Invoke-Command -Session $Session {Set-Location -Path LOC:} 

$SCCMdevices = Get-CMDevice -CollectionName "All Systems" | Where {$_.IsActive -like "True"} | Select-Object -Property Name, DeviceOS 

$SCCMdevices = $SCCMdevices -replace 'Microsoft Windows NT Workstation 5.1', 'Windows XP' ` 
         -replace 'Microsoft Windows NT Workstation 5.1 (Tablet Edition)', 'Windows XP' ` 
         -replace 'Microsoft Windows NT Workstation 6.1', 'Windows 7' ` 
         -replace 'Microsoft Windows NT Workstation 6.1 (Tablet Edition)', 'Windows 7' ` 
         -replace 'Microsoft Windows NT Workstation 6.1 (Embedded)', 'Windows 7' ` 
         -replace 'Microsoft Windows NT Workstation 6.2', 'Windows 8' ` 
         -replace 'Microsoft Windows NT Workstation 6.2 (Tablet Edition)', 'Windows 8' ` 
         -replace 'Microsoft Windows NT Workstation 6.3', 'Windows 8.1' ` 
         -replace 'Microsoft Windows NT Workstation 6.3 (Tablet Edition)', 'Windows 8.1' ` 
         -replace 'Microsoft Windows NT Workstation 10.0', 'Windows 10' ` 
         -replace 'Microsoft Windows NT Workstation 10.0 (Tablet Edition)', 'Windows 10' ` 
         -replace 'Microsoft Windows NT Server 5.2', 'Windows Server 2003' ` 
         -replace 'Microsoft Windows NT Advanced Server 5.2', 'Windows Server 2003' ` 
         -replace 'Microsoft Windows NT Server 6.0', 'Windows Server 2008' ` 
         -replace 'Microsoft Windows NT Advanced Server 6.0', 'Windows Server 2008' ` 
         -replace 'Microsoft Windows NT Server 6.1', 'Windows Server 2008 R2' ` 
         -replace 'Microsoft Windows NT Advanced Server 6.1', 'Windows Server 2008 R2' ` 
         -replace 'Microsoft Windows NT Server 6.2', 'Windows Server 2012' ` 
         -replace 'Microsoft Windows NT Advanced Server 6.2', 'Windows Server 2012' ` 
         -replace 'Microsoft Windows NT Server 6.3', 'Windows Server 2012 R2' ` 
         -replace 'Microsoft Windows NT Advanced Server 6.3', 'Windows Server 2012 R2' ` 
         -replace 'Microsoft Windows NT Server 10.0', 'Windows Server 2016' ` 
         -replace 'Microsoft Windows NT Advanced Server 10.0', 'Windows Server 2016' ` 
         -replace '6.1', 'Windows 7' ` 
         -replace '10.0', 'Windows 10' 
+1

функция вы вывесили должны вернуться массив строк для данного запроса, а не массив объектов. –

+1

Пожалуйста, рассмотрите вопрос о предоставлении [MCVE (минимальный, полный и проверенный пример)] (http://stackoverflow.com/help/mcve). – mklement0

+0

Добавление другого фрагмента кода, который делает что-то совершенно другое, не поможет прояснить ваш вопрос. Кроме того, вместо того, чтобы использовать метрическую тонну операций '-replace', я настоятельно рекомендую сопоставить имена ОС с их заменяемым значением хэш-таблицей во втором скрипте. –

ответ

0

Вот способ приблизиться к нему, так что вы» повторно не запущена строка модификатора -replace против всего объекта, а просто свойство:

$Array += $Reader.GetValue($i) | Select-Object *,@{N="HostName";E={$_.DNSName -replace '.123.com', '' -replace '.abc.com', ''}}