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-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 deGet-ChildItem
aGet-Item
y 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
-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.
- En el caso especial de la ruta
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 deGet-Item
lugar deGet-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 .
- Por el contrario, si usa
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*