Domanda

Mi manca qualcosa qui:

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

Quindi la domanda è perché le due seguenti risultati diversi?

$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
È stato utile?

Soluzione

Quando hai incluso $ _. properties.name nella stringa, stava restituendo il nome del tipo della proprietà. Quando una variabile viene inclusa in una stringa e la stringa viene valutata, chiama il metodo ToString su quell'oggetto a cui fa riferimento la variabile (non includendo i membri specificati dopo).

In questo caso, il metodo ToString sta restituendo il nome del tipo . Puoi forzare la valutazione della variabile e dei membri in modo simile a quanto suggerito da EBGreen, ma usando

"Server name in quotes $(

Quando hai incluso $ _. properties.name nella stringa, stava restituendo il nome del tipo della proprietà. Quando una variabile viene inclusa in una stringa e la stringa viene valutata, chiama il metodo ToString su quell'oggetto a cui fa riferimento la variabile (non includendo i membri specificati dopo).

In questo caso, il metodo ToString sta restituendo il nome del tipo . Puoi forzare la valutazione della variabile e dei membri in modo simile a quanto suggerito da EBGreen, ma usando

<*>

Nell'altro scenario PowerShell sta valutando prima la variabile e i membri specificati, quindi aggiungendola alla stringa precedente.

Hai ragione sul fatto che stai recuperando una raccolta di proprietà. Se si reindirizza $ computer [0] .properties a get-member, è possibile esplorare il modello a oggetti direttamente dalla riga di comando.

La parte importante è sotto.

  

TypeName: System.DirectoryServices.ResultPropertyCollection

     

Nome MemberType Definition

     
     

Proprietà dei valori System.Collections.ICollection Values ??{get;}

.properties.name)"

Nell'altro scenario PowerShell sta valutando prima la variabile e i membri specificati, quindi aggiungendola alla stringa precedente.

Hai ragione sul fatto che stai recuperando una raccolta di proprietà. Se si reindirizza $ computer [0] .properties a get-member, è possibile esplorare il modello a oggetti direttamente dalla riga di comando.

La parte importante è sotto.

  

TypeName: System.DirectoryServices.ResultPropertyCollection

     

Nome MemberType Definition

     
     

Proprietà dei valori System.Collections.ICollection Values ??{get;}

Altri suggerimenti

Credo che abbia a che fare con il modo in cui PS interpola le informazioni in " " ;. Prova questo:

" Nome del server tra virgolette $ ($ _. properties) .name "

O potresti anche aver bisogno di un altro set di $ (). Non sono da qualche parte in cui posso provarlo in questo momento.

Chiudi: il seguente funziona correttamente, ma sarei interessato se qualcuno avesse una spiegazione più approfondita.

PS C:\> $computers[0] | %{ "

Chiudi: il seguente funziona correttamente, ma sarei interessato se qualcuno avesse una spiegazione più approfondita.

$computers[0] | %{ 

Chiudi: il seguente funziona correttamente, ma sarei interessato se qualcuno avesse una spiegazione più approfondita.

PS C:\> $computers[0] | %{ "

Chiudi: il seguente funziona correttamente, ma sarei interessato se qualcuno avesse una spiegazione più approfondita.

<*>

Quindi sembra che $ _. properties.name non degni come mi aspettavo. Se sto visualizzando correttamente, il fatto che la proprietà name sia multivalore fa sì che restituisca un array. Quale (penso) spiegherebbe perché il seguente funziona:

<*>

Se " nome " se una stringa dovesse restituire il primo carattere, ma poiché è un array, restituisce la prima stringa.

.properties.name"; "$(

Chiudi: il seguente funziona correttamente, ma sarei interessato se qualcuno avesse una spiegazione più approfondita.

<*>

Quindi sembra che $ _. properties.name non degni come mi aspettavo. Se sto visualizzando correttamente, il fatto che la proprietà name sia multivalore fa sì che restituisca un array. Quale (penso) spiegherebbe perché il seguente funziona:

<*>

Se " nome " se una stringa dovesse restituire il primo carattere, ma poiché è un array, restituisce la prima stringa.

.properties.name)" } System.DirectoryServices.SearchResult.properties.name GORILLA

Quindi sembra che $ _. properties.name non degni come mi aspettavo. Se sto visualizzando correttamente, il fatto che la proprietà name sia multivalore fa sì che restituisca un array. Quale (penso) spiegherebbe perché il seguente funziona:

<*>

Se " nome " se una stringa dovesse restituire il primo carattere, ma poiché è un array, restituisce la prima stringa.

.properties.name[0]}

Quindi sembra che $ _. properties.name non degni come mi aspettavo. Se sto visualizzando correttamente, il fatto che la proprietà name sia multivalore fa sì che restituisca un array. Quale (penso) spiegherebbe perché il seguente funziona:

<*>

Se " nome " se una stringa dovesse restituire il primo carattere, ma poiché è un array, restituisce la prima stringa.

.properties.name"; "$(

Chiudi: il seguente funziona correttamente, ma sarei interessato se qualcuno avesse una spiegazione più approfondita.

<*>

Quindi sembra che $ _. properties.name non degni come mi aspettavo. Se sto visualizzando correttamente, il fatto che la proprietà name sia multivalore fa sì che restituisca un array. Quale (penso) spiegherebbe perché il seguente funziona:

<*>

Se " nome " se una stringa dovesse restituire il primo carattere, ma poiché è un array, restituisce la prima stringa.

.properties.name)" } System.DirectoryServices.SearchResult.properties.name GORILLA

Quindi sembra che $ _. properties.name non degni come mi aspettavo. Se sto visualizzando correttamente, il fatto che la proprietà name sia multivalore fa sì che restituisca un array. Quale (penso) spiegherebbe perché il seguente funziona:

<*>

Se " nome " se una stringa dovesse restituire il primo carattere, ma poiché è un array, restituisce la prima stringa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top