Considere el siguiente script de Powershell, que busca carpetas en C: \ con un 'og' en su nombre:
PS C: \> (ls |% {$ _. Name} |? {$ _. Contiene ("og")}) PerfLogs Archivos de programa setup.log
Ahora limito la búsqueda para obtener solo un elemento:
PS C: \> (ls |% {$ _. Name} |? {$ _. Contiene ("Prog")}) Archivos de programa
Lo extraño es que la primera operación produce una matriz , mientras que la segunda operación (que en mi humilde opinión es semánticamente la misma operación, por lo que debería producir el mismo tipo de resultado) produce una cadena . Esto se puede ver en el siguiente resultado:
PS C: \> (ls |% {$ _. Name} |? {$ _. Contiene ("og")}). Longitud 3 PS C: \> (ls |% {$ _. Name} |? {$ _. Contiene ("Prog")}). Longitud 13
Esto puede ser muy irritante, ya que aparentemente hay menos carpetas que coinciden con 'og' que las que coinciden con 'Prog'.
Evidentemente, PowerShell 'desempaqueta' implícitamente una matriz de un solo elemento en un solo objeto, y nunca obtenemos una matriz de longitud 1. Parece que cada vez que quiero contar los resultados que vienen por la tubería, tengo que verificar si ' Estoy tratando con una matriz o no.
¿Cómo puedo evitar que esto suceda? Como tratas con esto?
fuente
$_.Contains
, entonces%{,,$_.Name}
funciona ...Respuestas:
Y cero resultados del artículo a
$null
.No puedes
Utilice el constructor de matrices (
@(...)
) para forzar el retorno de una colección (posiblemente con cero o un elemento):fuente
@(1) | ConvertTo-Json
Todavía regresa en1
lugar de[1]
.ConvertTo-Json
nunca devuelve una colección: lee toda la entrada y la convierte en una sola cadena. Si desea convertir objetos de entrada individualmente, deberá procesar cada uno por separado.Esto se ha resuelto en PowerShell v3:
http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2012/03/19/Counting-objects-in-PowerShell-3.0.aspx
En una nota al margen, puede encontrar si un nombre contiene algo usando un comodín:
fuente
Tenga en cuenta la diferencia entre estos dos resultados:
El punto es que la operación de tubería está haciendo el 'desempaquetado'. ConvertTo-Json todavía ve el objeto como una matriz si usamos InputObject en lugar de tuberías.
fuente