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?
fonte
$_.Contains
, em seguida,%{,,$_.Name}
funciona ...Respostas:
E zero item resulta para
$null
.Você não pode.
Use o construtor array (
@(...)
) para forçar o retorno de uma coleção (possivelmente com zero ou um elemento):fonte
@(1) | ConvertTo-Json
ainda retorna em1
vez de[1]
.ConvertTo-Json
nunca retorna uma coleção: lê toda a entrada e converte em uma única string. Se você deseja que os objetos de entrada sejam convertidos individualmente, será necessário processar cada um separadamente.Isso foi resolvido no PowerShell v3:
http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2012/03/19/Counting-objects-in-PowerShell-3.0.aspx
Em uma nota lateral, você pode descobrir se um nome contém algo usando um curinga:
fonte
Observe a diferença entre estes dois resultados:
O ponto é que o 'unboxing' está sendo feito pela operação do tubo. O ConvertTo-Json ainda vê o objeto como uma matriz se usarmos InputObject em vez de canalizar.
fonte