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, porqueC: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.
- Para apuntar a la carpeta raíz de la unidad C :, debe usar
El uso del
-Exclude(y también-Include) sin-Recurseni con un valor-Pathque termina en/*menudo no arroja-Pathresultado. ¿Inesperado? De hecho, mira más abajo para más.- Por lo tanto,
Get-Item -Path C:/* -Exclude *.txt: tenga en cuenta el cambio deGet-ChildItemaGet-Itemy el*afterC:/- es necesario para hacer que su comando funcione para los elementos ubicados directamente enC:/solo.
- Por lo tanto,
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
-Includedebido 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-Itemy anexe/*al valor del parámetro-Path.-
Get-ChildItem -Path C:/ -Filter *.txtfunciona bien para hacer coincidir todos los archivos*.txten el directorio raíz de C :, por ejemplo.
-
Dicho esto, hay advertencias :
El lenguaje de patrones comodín admitido por
-Filtertiene 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.-Filteradmite solo un patrón único , mientras que-Includeadmite 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 .
-Excludey-Excludeno funcionan como uno esperaría intuitivamente :-Excludey-Excludemodificar el componente de ruta (última) de la-Pathargumento-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-Recurseno 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-Excludenada.- 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.
- En el caso especial de la ruta
Como se indicó, el problema no
-Recursesi 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 / -Excludecon
Get-Item C:/path/to/* -Include / -Exclude: tenga en cuenta el uso deGet-Itemlugar deGet-ChildItem, y que/*se haya añadido al argumento-Path.- Por el contrario, si usa
Get-ChildItemy hay directorios entre las coincidencias,Get-ChildItemgenerará sus contenidos en su lugar .
- Por el contrario, si usa
Con
-LiteralPathlugar de-Path,-Pathy-Excludese 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*