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, porqueC:
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.
- Para apuntar al carpeta raíz de la unidad C:, debe utilizar
-
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 deGet-ChildItem
aGet-Item
y el*
despuésC:
– es necesario para que su comando funcione para los elementos ubicados directamente enC:
solo.
- Por lo tanto,
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.
- Apuntando a un raíz directorio – p.ej,
-
-
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 reemplazarGet-ChildItem C:pathto -Include / -Exclude
conGet-Item C:pathto* -Include / -Exclude
– tenga en cuenta el uso deGet-Item
en vez deGet-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.
- Por el contrario, si usa
-
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.