Considera il seguente script Powershell, che cerca le cartelle in C: \ con un 'og' nel loro nome:
PS C: \> (ls |% {$ _. Nome} |? {$ _. Contiene ("og")}) PerfLogs File di programma Setup.log
Ora restringo la ricerca per ottenere un solo elemento:
PS C: \> (ls |% {$ _. Nome} |? {$ _. Contiene ("Prog")}) File di programma
La cosa strana è che la prima operazione produce un array , mentre la seconda operazione (che è IMHO semanticamente la stessa operazione, quindi dovrebbe produrre lo stesso tipo di risultato) produce una stringa . Questo può essere visto nel seguente risultato:
PS C: \> (ls |% {$ _. Nome} |? {$ _. Contiene ("og")}). Lunghezza 3 PS C: \> (ls |% {$ _. Nome} |? {$ _. Contiene ("Prog")}). Lunghezza 13
Questo può essere molto irritante, poiché apparentemente ci sono meno cartelle che corrispondono a "og" rispetto a quelle che corrispondono a "Prog".
Evidentemente, PowerShell "decomprime" implicitamente un array a singolo elemento in un singolo oggetto e non otteniamo mai un array di lunghezza 1. Sembra che ogni volta che voglio contare i risultati che arrivano sulla pipeline, devo verificare se ho a che fare con un array o no.
Come posso evitare che ciò accada? come lo gestisci?
$_.Contains
, allora%{,,$_.Name}
funziona ...