Considere o seguinte script do Powershell, que procura pastas em C: \ com um 'og' no nome:
PS C: \> (ls |% {$ _. Nome} |? {$ _. Contém ("og")}) PerfLogs Arquivos de Programas setup.log
Agora refino a pesquisa para obter apenas um item:
PS C: \> (ls |% {$ _. Nome} |? {$ _. Contém ("Prog")}) Arquivos de Programas
O estranho é que a primeira operação gera uma matriz , enquanto a segunda operação (que é IMHO semanticamente a mesma operação, portanto deve produzir o mesmo tipo de resultado) gera uma string . Isso pode ser visto no seguinte resultado:
PS C: \> (ls |% {$ _. Nome} |? {$ _. Contém ("og")}). Comprimento 3 PS C: \> (ls |% {$ _. Nome} |? {$ _. Contém ("Prog")}). Comprimento 13
Isso pode ser muito irritante, pois aparentemente há menos pastas que correspondem a 'og' do que aquelas que correspondem a 'Prog'.
Evidentemente, o PowerShell implicitamente 'unboxes' uma matriz de item único para um único objeto, e nunca temos uma matriz de comprimento 1. Parece que toda vez que eu quero contar os resultados que chegam ao pipeline, tenho que verificar se eu ' estou lidando com uma matriz ou não.
Como posso impedir que isso aconteça? Como você lida com isso?
$_.Contains
, em seguida,%{,,$_.Name}
funciona ...