1 votos

PowerShell: renombrar / eliminar archivos en una carpeta que puede aparecer en diferentes lugares en la jerarquía de archivos

Actualmente tratando de encontrar una manera de cambiar el nombre de archivos PDF en una carpeta determinada (/root) que están directamente o indirectamente en el interior de un purchases carpeta que está directamente o indirectamente en el interior de la /rootcarpeta. Me gustaría conseguir este con PowerShell, pero no puede llegar más allá de los ejemplos que he encontrado en los numerosos temas por ahí.

Por ejemplo, con esta estructura de directorios:

/root/<subfolder1>/purchases/invoice1.pdf
/root/<subfolder1>/order.pdf
/root/<subfolder2>/purchases/invoice2.pdf

La intención es sólo cambiar el nombre o eliminar los archivos PDF que residen en la "compra" de las carpetas. Los archivos PDF en cualquier otra carpeta que no debe ser tocado.

El <subfolderX> nombres son desconocidos (es decir, que puede ser cualquier cosa, por ejemplo, "a" o "b").

El script necesita para ejecutar todas las carpetas de forma recursiva.

Cualquier orientación hacia el logro de esto se agradece.

2voto

Youssef Abidi Puntos 120

Respuesta corta

Para mostrar los nombres de los archivos PDF directamente o indirectamente contenida en un directo o indirecto subdirectorio de d:\root nombre purchases, se puede utilizar:

gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | % FullName

Breve explicación: el comando de forma recursiva encuentra todas directos e indirectos subdirectorios de d:\root nombre purchases, luego se encuentra de forma recursiva todos los archivos PDF en cada uno de estos subdirectorios, a continuación, devuelve la ruta completa de cada uno de estos archivos PDF.

Otros casos de uso

Para eliminar estos archivos en formato PDF:

gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | ri

Para cambiar el nombre de estos archivos PDF (por ejemplo, mediante la adición de un prefijo y un sufijo para el nombre de la base):

gci -Directory -Recurse d:\root\purchases | % { gci -Recurse "$_\*.pdf" } | % { rni $_ "pref-$($_.BaseName)-suff.pdf" }

Para quitar el purchases directorios junto con todo su contenido:

gci -Directory -Recurse d:\root\purchases | ri -Recurse

Explicación detallada

  • gci es un alias para Get-ChildItem.
  • gci -Directory -Recurse d:\root\purchases devuelve todos los directorios (-Directory) cuyo nombre es purchases que son directa o indirecta (-Recurse) subcarpetas de d:\root\. En otras palabras, se volverían d:\root\purchases (si existe) así como d:\root\b\c\purchases y d:\root\a\purchases. Esto no es muy intuitivo y no parece que se explica en la documentación, pero es el comportamiento actual (como de PowerShell 6).
  • % es un alias para ForEach-Object. Se ejecuta un bloque de secuencia de comandos (encerrado entre llaves ({}) para cada objeto en la tubería.
  • gci -Recurse "$_\*.pdf" recupera la lista de archivos PDF (directa o indirectamente) que figuran en el que anteriormente se encuentra purchases directorios.
  • % FullName es utilizado para mostrar la ruta de estos archivos PDF.
  • ri es un alias para Eliminar Elemento. Se elimina la anteriormente calculada lista de los archivos PDF (debido a que el -Path parámetro de la Remove-Item comando acepta tubería de entrada).
  • ri -Recurse permite eliminar la anteriormente calculada lista de purchases directorios, junto con su contenido.
  • rni $_ "pref-$($_.BaseName)-suff.pdf" añade un prefijo (pref-) y un sufijo (-suff) para el nombre de la base de $_.BaseName del archivo actual en la tubería (es decir, cada uno de los archivos PDF que estamos buscando). El nombre de la base de un archivo es el nombre del archivo sin extensión y rni es un alias para cambiar el nombre del Elemento.

Prueba esta solución (en línea o localmente)

Es el más fácil de probar esta solución en línea.

De lo contrario, puede crear un ejemplo de una estructura de directorios en un test carpeta del directorio de trabajo actual, con el siguiente fragmento de código (tenga cuidado: cambio .\test a algo más si usted ya tiene un test carpeta en el directorio actual):

mkdir -ErrorAction SilentlyContinue .\test\a\purchases, .\test\a\e\, .\test\b\c\purchases\
Out-File .\test\a\purchases\invoice1.pdf
Out-File .\test\a\order1.pdf
Out-File .\test\a\e\order2.pdf
Out-File .\test\b\c\purchases\invoice2.pdf
Out-File .\test\b\c\purchases\invoice3.pdf

Para ver todos los archivos en esta estructura de directorios, puede utilizar:

gci -Recurse -File .\test | % FullName

Que iba a regresar algo como:

D:\test\a\order1.pdf
D:\test\a\e\order2.pdf
D:\test\a\purchases\prefix-invoice1-suffix.pdf
D:\test\b\c\purchases\prefix-invoice2-suffix.pdf
D:\test\b\c\purchases\prefix-invoice3-suffix.pdf

(Donde D: es reemplazado con su directorio de trabajo actual.)

La ejecución del comando proporciona como una respuesta (gci -Directory -Recurse .\test\purchases | % { gci -Recurse "$_\*.pdf" } | % FullName), se muestran los archivos que necesitan ser removidos o eliminados:

D:\test\a\purchases\invoice1.pdf
D:\test\b\c\purchases\invoice2.pdf
D:\test\b\c\purchases\invoice3.pdf

Para limpiar después de la prueba:

rm -Recurse .\test

1voto

postanote Puntos 159

Youssef Abidi dio una respuesta a la orientación de una sola unidad, pero parece que usted está diciendo la ruta de la carpeta .\compras, es desconocido?

Sin embargo, la regla del foro es la que debe proporcionar lo que he probado y errores encontrados hasta las que muestran lo que usted meta final es que, frente a lo que nos adivinar, y como la mayoría diría que 'hagan el trabajo por usted'. La gente de aquí son bastante útiles, pero, bueno, ya sabes.

Todo lo que se dice, si mi suposición es correcta. Esencialmente, haz un filtro para las compras de la carpeta en cualquier unidad del ejército, y, a continuación, el archivo pdf en la carpeta y hacer lo que quieras.

Es realmente sólo one-liner comando canalizado - si la anterior es una suposición válida

(Get-PSDrive).Root -like '*:\' | 
% { (Get-ChildItem -Path ((Get-ChildItem -Path $_ -recurse -Filter Purchases -Directory -ErrorAction SilentlyContinue).FullName) -Filter '*.pdf' -Verbose).FullName }

# Results

C:\purchases\powershell-cheat-sheet.pdf
C:\purchases\PSPunctuationWallChart_1_0_4.pdf
D:\Temp\purchases\powershell-cheat-sheet.pdf
D:\Temp\purchases\PSPunctuationWallChart_1_0_4.pdf

Por supuesto, usted puede romper ese one-liner en algo diferente.

0voto

loewie1984 Puntos 6

Estoy de acuerdo en que hacer mi tarea es esencial para la comunidad. Lo descubrí tanto con GCI y filtro pero no pude improvisar la parte del doble GCI entre comillas.

Haré todo lo posible para que mi próxima pregunta muestre algunos esfuerzos. Independientemente de ambas respuestas, me han ayudado a resolver este problema.

Así que de nuevo muchas gracias!

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: