Saltar al contenido

El uso de Get-ChildItem -Exclude o -Include no devuelve nada

Te recomendamos que revises esta respuesta en un ambiente controlado antes de pasarlo a producción, un saludo.

Para resumir y complementar las útiles respuestas de gravity y Brian Reynolds:

Hay dos problemas distintos con su enfoque:

  • Segmentación C: probablemente no hace (siempre) lo que quieres, porque C: se refiere a lo que sea que sea la ubicación actual (directorio de trabajo) en la unidad C: en este momento.

    • Para apuntar al carpeta raíz de la unidad C:, debe utilizar C:, que asumiré que es lo que quiso decir en el resto de esta respuesta.
  • Utilizando el -Exclude (y también -Include) parámetro sin ninguno -Recurse ni un -Path valor que termina en * a menudo NO da resultados. ¿Inesperado? De hecho, consulte a continuación para obtener más información.

    • Por lo tanto, Get-Item -Path C:* -Exclude *.txt – tenga en cuenta el cambio de Get-ChildItem a Get-Item y el * después C: – es necesario para que su comando funcione para los elementos ubicados directamente en C: solo.

Información de contexto:

Usando el proveedor nativo -Filter El parámetro es generalmente preferible a -Include, porque:

  • es mucho más rápido que -Include debido a que el propio proveedor realiza el filtrado en la fuente, en lugar de permitir que PowerShell aplique el filtro más tarde, después de que se hayan recibido todos los objetos.

  • no requiere que cambies a Get-Item y anexar * al -Path valor del parámetro.

    • Get-ChildItem -Path C: -Filter *.txt funciona bien para combinar todos *.txt archivos en el directorio raíz de C :, por ejemplo.

Dicho esto, hay Advertencias:

  • El lenguaje de patrones comodín admitido por -Filter tiene menos funciones que PowerShell y puede coincidir inesperadamente con nombres de archivo cortos (8.3) – vea esta respuesta bien investigada para los detalles sangrientos.

  • -Filter admite solo un único patrón, mientras que -Include admite varios (un array de patrones).

Desafortunadamente, -Filter es siempre un positivo filtro (inclusivo) y por lo tanto no se puede utilizar para proporcionar la funcionalidad de -Exclude.


La implementación de -Include / -Exclude con Get-ChildItem no es intuitivo y tiene dificultades:

Nota al margen: si solo usa una-Include patrón (a diferencia de -Exclude), es más fácil agregar el patrón directamente al -Path argumento; p.ej: Get-ChildItem C:*.txt

tl; dr:

Para obtener un comportamiento predecible con -Include / -Exclude, use lo siguiente – a no ser que tu tambien usas -Recurse, en cuyo caso esta solución alternativa no es necesaria:

# IMPORTANT: Note the appended "*" and the switch from
# Get-*ChildItem* to Get-*Item*
Get-Item C:pathto* -Include ...
Get-Item C:pathto* -Exclude ...

  • -Include y -Exclude no funcionan como uno esperaría intuitivamente:

    • -Include y -Exclude modificar el hoja (último) componente de ruta del -Path argumento.

    • Eso significa que los patrones son primero aplicado al componente de hoja del especificado ruta de la carpeta en sí, antes de siendo aplicado a la elementos secundarios, como mucho.

    • Si la ruta de entrada no termina en * y -Recurse no se especifica, las implicaciones son las siguientes:

      • -Include: Si el último componente de la ruta de entrada no no coincidir con el -Include patrón (s), la ruta de entrada sí mismo está excluido (no incluido), y la ruta niño los elementos nunca se miran, no se emite nada.

      • -Exclude: Análogamente, si el último componente de la ruta de entrada lo hace coincidir con el -Exclude patrón (s), la ruta de entrada sí mismo está excluido, y el camino niño los elementos nunca se miran, no se emite nada.

        • Apuntando a un raíz directorio – p.ej, Get-ChildItem -Path C: -Exclude Windows) parece ser roto por completo a partir de la v7.0: o no produce ningún resultado o falla en plataformas similares a Unix, ambas con -Include y -Exclude, independientemente de los patrones utilizados, consulte este problema de GitHub.
    • Como se dijo, el problema no sale a la superficie si -Recurse se utiliza, por eso efectivo descendiendo al subárbol de la ruta de entrada, incluso si la ruta de entrada en sí no está incluida / excluida.

  • A no ser que -Recurse es necesario, la única forma de obtener el comportamiento esperado es reemplazar
    Get-ChildItem C:pathto -Include / -Exclude con
    Get-Item C:pathto* -Include / -Exclude – tenga en cuenta el uso de Get-Item en vez de Get-ChildItem, y eso * se adjuntó al -Path argumento.

    • Por el contrario, si usa Get-ChildItem y aquí están directorios entre los partidos, Get-ChildItem saldrá su contenido en su lugar.
  • Con -LiteralPath en vez de -Path, -Include y -Exclude son silenciosamente ignorado – no tienen ningún efecto.


Ejemplos: usos problemáticos de -Include / -Exclude

Nota: Para que todos los comandos siguientes funcionen como uno esperaría intuitivamente, reemplace Get-ChildItem C:Windows con Get-Item C:Windows* – tenga en cuenta el uso de un cmdlet diferente, Get-Item, y el adjunto *.

# HAPPENS TO WORK, BUT IS NOT ROBUST:
# Matches all w* items *inside* C:Windows, but
# ONLY because w* happens to match 'Windows' - the last input
# path component - too.
Get-ChildItem C:Windows -Include w*

# HAPPENS TO WORK, BUT IS NOT ROBUST:
# Matches all items whose names *don't* start with a-v *inside* C:Windows, but
# ONLY because [a-v]* happens not to exclude 'Windows' - the last input
# path component - too.
Get-ChildItem C:Windows -Exclude [a-v]*


# OUTPUTS NOTHING:
# Because t* doesn't match 'Windows', the child items of 
# 'C:Windows' are not considered.
Get-ChildItem C:Windows -Include t*

# OUTPUTS NOTHING:
# Because w* matches 'Windows', it is excluded, and
# the child items of 'C:Windows' are not considered.     
Get-ChildItem C:Windows -Exclude w*

Get-ChildItem -Path "C:*" -Include "*.txt"

Este ejemplo, de cómo -Include debería funcionar, le dará los resultados que esperaba. Tenga en cuenta que también proporcioné un comodín en el parámetro de ruta, para definir explícitamente la ruta como “cualquier archivo en la raíz C:” en lugar de “C:” en sí.

Fuente: https://technet.microsoft.com/library/hh849800.aspx

Ejemplo 3 de este enlace, en caso de que desaparezca (tenga en cuenta el comodín en la ruta aquí también):

C:> Get-ChildItem –Path "C:WindowsLogs*" -Include "*.txt" -Exclude "A*"

Usar ‘C:’ sin barra inclinada después es la razón por la que no está obteniendo los resultados que desea. Esto se interpreta como una ruta relativa al directorio actual en lugar de la raíz de la unidad C. (Consulte: Ruta sin barra inclinada después de la letra de unidad y dos puntos: ¿a qué apunta?)

Si usa ‘C: ‘ en su lugar, debería funcionar como se esperaba.

Editar: mi error; Estaba respondiendo específicamente a los ejemplos que solo usan ‘-excluir’.

Valoraciones y reseñas

Agradecemos que quieras añadir valor a nuestra información añadiendo tu veteranía en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *