Приведение объекта к массиву строк Powershell - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу создать массив строк вместо объекта переменной, чтобы я мог использовать ключевое слово «содержащий» в каждом индексе массива.

$myArray = Get-ADDomain

Приведенное выше описание создает объект, которыйне то, что я хочу.Я также попытался

[string[]] $myArray = Get-ADDomain

Но после этого $ myArray содержит только одну строку, и это первое непустое свойство Get-ADDomain, в моем случае «ComputersContainer».Что я должен сделать, чтобы получить массив строк, где каждая строка имеет свое свойство, например

$myArray[0] = "AllowedDNSSuffixes = {}"

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

PowerShell всегда будет возвращать объекты в соответствии с дизайном, и указание того, что [string []] на самом деле не меняет этого.

Для того, что вы пытаетесь использовать, вы должны форсировать создание массива.Ниже приведен только один способ, но я уверен, что у других будут и более элегантные способы сделать это.Хотя мне любопытно, почему так хочется.Но, эй, это только я.

# Create an empty array
$DomainData = @()

# Get all the data points for the utilized cmdlet, split on a common delimiter for the array
[string[]]$DomainData = (Get-ADDomain | Select *) -split ';'

# Display the array count 
$DomainData.Count
34

# validate getting a value from the array by using an index number
$Item = $DomainData[17]
NetBIOSName=CONTOSO

[array]::IndexOf($DomainData, $Item)
17

# Use that element number to validate the use of the contains comparison operator
0..($DomainData.Count - 1) | %{ If($DomainData[$_] -contains $item){"Index key is $_ contains a value of $Item"} }
Index key is 17 contains a value of  NetBIOSName=CONTOSO

# Use the previous with a partial string for a comparison, -contains cannot be used, like or match has to be used
# From the documentation:
# -Contains
# Description: Containment operator. Tells whether a collection of reference values includes a single test value.


$Item = '*domain*'
0..($DomainData.Count - 1) | %{ If($DomainData[$_] -like $item){"Index key is $_ like a value of $Item"} }
Index key is 1 like a value of *domain*
Index key is 6 like a value of *domain*
Index key is 7 like a value of *domain*
Index key is 8 like a value of *domain*
Index key is 18 like a value of *domain*
Index key is 20 like a value of *domain*
0 голосов
/ 27 декабря 2018

Вы не можете привести объект PSObject напрямую к строковому массиву, подобному этому.Однако это может быть выполнено довольно легко.

Чтобы получить массив строк из объекта

$myArray = Get-ADDomain
# You can use a standard array @() but these tends to be slower for bigger amount of data
$outArray = New-Object -TypeName System.Collections.Generic.List[String]

#To add just the value
$myArray.psobject.properties | Foreach { $outArray.Add($_.Value) }

# To add Name = {Value} instead
$myArray.psobject.properties | Foreach { $outArray.Add("$($_.Name) = {$($_.Value)}") }

Используя вместо этого hasthable:

$myArray = Get-ADDomain
$hashtable = @{}
$myArray.psobject.properties | Foreach { $hashtable[$_.Name] = $_.Value }
# If you need to do something with the key
Foreach ($key in $hashtable.Keys) {
    $Value = $hashtable[$key]
    if ($value -like '*prod*') {
        Write-Host $key
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...