subfolders recursively item files examples ejemplos childitem and powershell directory folder get-childitem

recursively - Cómo usar comodines con directorios en el cmdlet Get-ChildItem-Exclude de PowerShell



powershell list files in folder and subfolders (4)

Esto debería ser un trabajo para ti:

Get-ChildItem -Path C:/Root -Exclude "*/Folder2/*.pdb" -Recurse

Para un ejemplo simple, digamos que tengo una carpeta, Root , con tres carpetas; Carpeta1, Carpeta2 y Carpeta3. Cada una de estas carpetas (incluida Root ) tiene una gran cantidad de archivos, incluidos archivos .pdb. Deseo utilizar el cmdlet Get-ChildItem de PowerShell para devolver todos los archivos en todas las carpetas (incluida Root ), excepto para los archivos .pdb en Folder2. Si uso:

Get-ChildItem -Path C:/Root -Recurse -Exclude *.pdb

Luego recupero todos los archivos que no son .pdb en todos los directorios, lo cual es muy parecido a lo que deseo. Así que asumí que lo siguiente lograría lo que quiero:

Get-ChildItem -Path C:/Root -Recurse -Exclude /*//Folder2//*.pdb

Pero esto no excluye ninguno de los archivos pdb en Folder2 (o cualquier otra carpeta). He probado varias variantes para el filtro -Exclude , como Folder2///*.pdb , pero no puedo hacer que funcione. De hecho, incluso el uso de /*///*.pdb no parece hacer nada; no se excluyen archivos .pdb de ninguna carpeta.

Parece que los comodines no pueden usarse para directorios, solo nombres de archivos, pero supongo que estoy haciendo algo mal. Encontré este artículo explicando los comodines y operadores de rango , pero desafortunadamente no habla de usarlos con nombres de directorio; solo nombres de archivo.


La respuesta de OhadH está casi allí.

Puedes usar

Get-ChildItem -Recurse | Where-Object {$_.FullName -notmatch "folder2" -or $_.Name -notlike "*.pdb" }

o

Get-ChildItem -Recurse | ? {$_.FullName -notlike "*folder2*" -or $_.Name -notlike "*.pdb" }

Depende de dónde se encuentre su carpeta2. Pero creo que entendiste la idea.

Odio decirlo, pero PowerShell no es tan conveniente como Bash u otras conchas.


No he visto el parámetro exclude trabajando con directorios tampoco.

Podrías intentar conectar a Where-Object . Es decir,

Get-ChildItem -Recurse *.pdb | Where-Object {$_.FullName -notMatch "folder2"}


gci "C:/Root" -Recurse | Where-Object {$_.FullName -notlike "*Folder2/*.pdb*"} | Export-CSV "C:/Root/Export.csv" -NoType

Probado, probado y un trazador de líneas :-). Esto funciona porque he copiado la estructura de carpetas y archivos para replicar. Lamento que sea unos años tarde, sin embargo.

Siéntase libre de ajustar el código a sus necesidades, obviamente.