2009-04-26 7 views
11

De la documentación:confundido con el parámetro del -Include del cmdlet Get-ChildItem

del -Include

recupera sólo los elementos especificados. El valor de este parámetro califica el parámetro Ruta. Introduzca un elemento o patrón de ruta , como "* .txt". Se permiten comodines.

La Incluir parámetro sólo es efectivo cuando el comando incluye el parámetro Recurse o la ruta conduce al contenido de un directorio , como C: \ Windows *, donde el carácter comodín especifica los contenido de la C: \ directorio de Windows.

Mi primer entendimiento era:

c:\test\a.txt 
c:\test\b.txt 

Así que para conseguir 'a.txt' y 'b.txt' Puedo escribir:

gci -Path "c:\test\*" -Include "*.txt" 

Y esto funciona. Pero ahora considerar dicha jerarquía:

c:\test\a.txt 
c:\test\b.txt 
c:\test\c.txt\c.txt 

El comando devuelve: mismos a.txt, B.txt, c.txt

La lógica real parece ser:

del -Include usados para hacer coincidir todas las entidades especificadas por -Path. Si el elemento coincidente es un archivo, devuélvalo. Si el elemento coincide con una carpeta, busque dentro y return matching first level children.

Además, la documentación dice:

La Incluir parámetro sólo es efectivo cuando el comando incluye el parámetro Recurse o la camino conduce al contenido de un directorio ...

Esto también está mal. P.ej.

gci -Path "c:\test" -Include "*.txt" 

No devuelve nada, mientras que sin -Incluir obtengo contenido de la carpeta. Entonces -Incluir es definitivamente "efectivo". ¿Qué pasa realmente aquí? El -Path especifica la "c: \ test" y el -Include intenta hacer coincidir esta ruta. Como "* .txt" no coincide con "prueba", no devuelve nada. Pero mira esto:

gci -Path "c:\test" -Include "*t" 

Devuelve a.txt, b.txt y c.txt como "* t" emparejado "prueba" y acertó los elementos secundarios.

Después de todo, incluso sabiendo cómo funciona Include ahora, no entiendo cuándo usarlo. ¿Por qué lo necesito para mirar dentro de las subcarpetas? ¿Por qué debería ser tan complejo?

Respuesta

14

Está confundiendo el uso de -include.El indicador -include se aplica a la ruta, no al contenido de la ruta. Sin el uso de la bandera recursiva, la única ruta en cuestión es la ruta que especifique. Esta es la razón por la cual el último ejemplo que diste funciona, la ruta c:\test tiene una t en la ruta y por lo tanto coincide con "*t".

Usted puede verificar esto al tratar el siguiente

gci -path "c:\test" -in *e* 

Esto todavía producirá todos los niños en el directorio, sin embargo, no coincide con ninguno de sus nombres.

El motivo por el cual -include es más efectivo con el parámetro recurse es que termina aplicando el comodín contra cada ruta en la jerarquía.

+0

Estoy usando PowerShell-v2.0-CTP3, y su ejemplo produce un conjunto vacío. – alex2k8

+0

@ alex2k8, No estoy seguro de qué decir aquí. He intentado este ejemplo en 1.0 y una compilación 2.0 posterior, ambos producen los mismos resultados. – JaredPar

+0

@Jared, esto es extraño. Por favor, puedes probar gci -path c: \ * -in *. Veo hijos de c: \ y todas sus subcarpetas están un nivel abajo. Aquí está la descripción similar http://www.eggheadcafe.com/software/aspnet/32624832/getchilditem-include-qu.aspx – alex2k8

4

Haciendo clic en JaredPar's answer, para hacer una coincidencia de patrón con Get-ChildItem, puede usar comodines de shell comunes.

Por ejemplo: "?"

get-childitem "c:\test\t?st.txt" 

donde el es un comodín un carácter o

get-childitem "c:\test\*.txt" 

que coincidirá con cualquier nombre de archivo que termina en ".txt".

Esto debería tener el comportamiento "más simple" que estaba buscando.

+0

¿No es el problema aquí que solo puede obtener una sola extensión? -Include es una cadena [] que permite múltiples variaciones coincidentes. Gracias, Ben –

9

Pruebe el parámetro -Filter (que tiene soporte para una sola extensión):

dir -Filter * .txt

+5

El filtro es ligeramente diferente porque es una implementación específica del proveedor. Por lo general, es más eficiente porque ocurre antes de que se devuelvan los datos. Pero tiene una implementación diferente para cada proveedor de unidades en PowerShell. Por lo tanto, puede haber diferencias sutiles en el algoritmo de coincidencia. – JaredPar

+0

Acepto, aunque en este caso estamos hablando del proveedor del sistema de archivos. Thnaks para el comentario. –

2

yo sólo hizo una pregunta similar y con tres respuestas rápidas concernientes a la Get-Help para Get- ChildItem.

La respuesta está en la descripción completa del comando (Get-Help Get-ChildItem -Full):

The Include parameter is effective only when the command includes the 

parámetro Recurse o la ruta conduce a el contenido de un directorio, como C: \ Windows *, donde el carácter comodín especifica el contenido de del directorio C: \ Windows.

Así que lo siguiente funcionaría sin recurse.

PS C: \ -path foo> Get-childitem "c: \ foo *" * .txt del -Include

De la pregunta de desbordamiento de pila PowerShell Scripting - Get-ChildItem.

espero que esto ayuda :-)

+0

Ben, en realidad mi pregunta era un poco diferente. Tenga en cuenta que su ejemplo devolverá archivos .txt de la carpeta foo, PERO también puede devolver inesperadamente archivos e incluso carpetas de, por ejemplo, el directorio "c: \ foo \ dir.txt". Pruebe dicha jerarquía: c: \ foo \ dir.txt \ archivo.txt y c: \ foo \ dir.txt \ dir2.txt \ archivo2.txt. Obtendrás: file.txt y dir2.txt! – alex2k8

0

Incluyendo \* al final de la ruta debe evitar el problema

PS C:\logfiles> Get-ChildItem .\* -include *.log 

Esto debería devolver.archivos de registro del directorio de trabajo actual (C:\logfiles)

El ejemplo anterior de Alex indica que también se devolverá un directorio con el nombre foo.log. Cuando lo probé, no fue pero es 6 años después y podría ser de actualizaciones de PS.

Sin embargo, puede utilizar el elemento secundario Mode para excluir directorios, creo.

PS C:\logfiles> Get-Childitem .\* -include *.log | where-object {$_.mode -notmatch "d"} 

Esto debería excluir cualquier cosa con el modo 'directorio' configurado.

+0

Incluir \ * al final de la ruta no siempre funciona. No sé de ninguna manera para especificar un valor de inclusión para hacer coincidir los archivos que no tienen extensión de nombre de archivo. Especificar * como un patrón de inclusión coincidirá con dichos archivos, pero hace que Get-ChildItem actúe recursivamente. Si -Incluir se comportó de la misma manera que Excluir, sería fácil. – MikeOnline

Cuestiones relacionadas