utiles usar sintaxis scripts ise ejemplos content como comandos childitem powershell powershell-v4.0

powershell - usar - El uso de Get-ChildItem-Exclude o-Include no arroja nada



scripts powershell utiles (3)

Tengo una lista en mi directorio C: que tiene muchos archivos. Si trato de ejecutar un -Excluido en él, no obtengo devoluciones. Lo mismo con -Incluir. Si uso filtro, devuelve lo que esperaba recuperar. ¿No entiendo lo que debería estar haciendo?

Aquí hay un ejemplo de lo que estoy ejecutando y no obtengo nada:

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

No recibo nada de vuelta. Si corro

Get-Childitem -filter "*.txt"

Lo entiendo de vuelta:

Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 11/7/2007 8:00 AM 17734 eula.1028.txt -a---- 11/7/2007 8:00 AM 17734 eula.1031.txt -a---- 11/7/2007 8:00 AM 10134 eula.1033.txt -a---- 11/7/2007 8:00 AM 17734 eula.1036.txt -a---- 11/7/2007 8:00 AM 17734 eula.1040.txt -a---- 11/7/2007 8:00 AM 118 eula.1041.txt -a---- 11/7/2007 8:00 AM 17734 eula.1042.txt -a---- 11/7/2007 8:00 AM 17734 eula.2052.txt -a---- 11/7/2007 8:00 AM 17734 eula.3082.txt 7/7/2016 8:50 AM 93 HaxLogs.txt -a---- 7/8/2016 8:30 AM 0 Test.txt


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 ruta, para definir explícitamente la ruta como "cualquier archivo en la raíz C:" en oposición a "C:" en sí.

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

Ejemplo 3 de este enlace, en caso de que se acabe (observe el comodín en la ruta aquí, también):

C:/> Get-ChildItem –Path "C:/Windows/Logs/*" -Include "*.txt" -Exclude "A*"


El uso de ''C:'' sin barra después de que 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 del disco C. (Consulte: Ruta sin barra tras letra de unidad y dos puntos: ¿a qué apunta? )

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

Editar: mi error; Respondí específicamente a los ejemplos que solo usan ''-excluir''.


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

Hay dos problemas distintos con su enfoque:

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

    • Para apuntar a la carpeta raíz de la unidad C :, debe usar C:/ , que asumiré es lo que quiso decir en el resto de esta respuesta.
  • El uso del -Exclude (y también -Include ) sin -Recurse ni con un valor -Path que termina en /* menudo no arroja -Path resultado. ¿Inesperado? De hecho, mira más abajo para más.

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

Información de fondo:

El uso del parámetro provider-native -Filter generalmente es preferible a -Include , porque:

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

  • no requiere que cambie a Get-Item y anexe /* al valor del parámetro -Path .

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

Dicho esto, hay advertencias :

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

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

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

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

Nota al -Exclude : si solo usa un patrón de " -Exclude (en oposición a " -Exclude ), es más fácil agregar el patrón directamente al argumento -Path ; por ejemplo: Get-ChildItem C:/*.txt

tl; dr : para obtener un comportamiento predecible con -Exclude / -Exclude , use Get-Item C:/path/to/* (tenga en cuenta el adjunto /* y el cambio de Get-*Child*Item ) - a menos que también use -Recurse .

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

    • -Exclude y -Exclude modificar el componente de ruta (última) de la -Path argumento -Path .

    • Esto significa que los patrones se aplican primero al componente de la hoja de la ruta de la carpeta , antes de aplicarse a los elementos secundarios , en todo caso.

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

      • -Include : si el último componente de ruta de la ruta de entrada no coincide con el patrón -Include , la propia ruta de entrada se excluye (no incluida) y los elementos secundarios de la ruta nunca se miran, no se genera nada.

      • -Exclude : Análogamente, si el último componente de ruta de la ruta de entrada coincide con el patrón -Exclude , la propia ruta de entrada queda excluida y los elementos secundarios de la ruta nunca se miran, no se -Exclude nada.

        • En el caso especial de la ruta C:/ ( Get-ChildItem -Path C:/ -Exclude <any-pattern> ), donde podría decirse que el último componente de ruta es la cadena vacía , parece que cualquier patrón de exclusión se considera una coincidencia, y no se produce producción alguna vez.
    • Como se indicó, el problema no -Recurse si se utiliza -Recurse , porque esa fuerza desciende al subárbol de la ruta de entrada, incluso si la propia ruta de entrada no está incluida / excluida.

  • A menos que se necesite -Recurse , la única forma de obtener el comportamiento esperado es reemplazar
    Get-ChildItem C:/path/to -Include / -Exclude con
    Get-Item C:/path/to/* -Include / -Exclude : tenga en cuenta el uso de Get-Item lugar de Get-ChildItem , y que /* se haya añadido al argumento -Path .

    • Por el contrario, si usa Get-ChildItem y hay directorios entre las coincidencias, Get-ChildItem generará sus contenidos en su lugar .
  • Con -LiteralPath lugar de -Path , -Path y -Exclude se ignoran silenciosamente , no tienen efecto alguno.

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

Nota: para que todos los comandos a continuación 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*