Vra

Ek is iets hier ontbreek:

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher  
$objSearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry  
$objSearcher.Filter = ("(objectclass=computer)")  
$computers = $objSearcher.findall()  

Die vraag is dus waarom die twee volgende uitsette verskil?

$computers | %{ 
"Server name in quotes $_.properties.name" 
"Server name not in quotes " + $_.properties.name 
}
PS> $computers[0] | %{"$_.properties.name"; $_.properties.name}
System.DirectoryServices.SearchResult.properties.name
GORILLA
Was dit nuttig?

Oplossing

As jy ingesluit $ _. Properties.name in die tou, is dit die terugkeer van die naam tipe van die eiendom. Wanneer 'n veranderlike is ingesluit in 'n string en die string is geëvalueer, dit noem die toString-metode op daardie voorwerp verwys deur die veranderlike (nie insluitend die na gespesifiseerde lede).

In hierdie geval, die toString-metode is die terugkeer van die tik naam . Jy kan die evaluering van die veranderlike en lede soortgelyk aan wat EBGreen voorgestel te dwing, maar deur die gebruik van

"Server name in quotes $($_.properties.name)"  

In die ander scenario PowerShell is die evaluering van die veranderlike en lede gespesifiseerde eerste en dan voeg dit by die vorige string.

Jy is reg dat jy kry terug 'n versameling van eiendomme. As jy pyp $ rekenaar [0] .properties om lede te kry, kan jy die voorwerp model verken reg van die command line.

Die belangrike deel is hieronder.

  

Type Name: System.DirectoryServices.ResultPropertyCollection

     

Naam MemberType Definisie

     
     

Waardes Property System.Collections.ICollection Waardes {kry;}

Ander wenke

Ek glo dit het te doen met die manier waarop PS interpolates inligting in die "". Probeer hierdie:

"naam Server in aanhalingstekens $ ($ _. Eiendomme) Name"

Of jy kan selfs 'n meer stel $ benodig (). Ek is nie iewers dat ek dit kan toets op die oomblik.

Close-- Die onderstaande korrek werk, maar ek wil belangstel as iemand 'n dieper verduideliking.

PS C:\> $computers[0] | %{ "$_.properties.name"; "$($_.properties.name)" }
System.DirectoryServices.SearchResult.properties.name
GORILLA

Dit wil voorkom asof $ _. Properties.name nie onderdanigheid soos ek verwag het dit aan. As ek behoorlik is die verbeelding, die feit dat die eiendom naam is multivalued veroorsaak dat dit 'n skikking terugkeer. Wat (ek dink) sal verduidelik waarom die volgende werke:

$computers[0] | %{ $_.properties.name[0]}

As "naam" is 'n string moet hierdie die eerste karakter terugkeer nie, maar omdat dit 'n skikking dit gee die eerste string.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top