es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Powershell – Descomprimir todos los archivos comprimidos en un directorio y cambiar su nombre según los nombres de los archivos principales.

Tengo una carpeta y un conjunto de archivos así:

  • Raíz>
  • Padre 1>
  • Archivo 1> export.zip> export.txt
  • Archivo 2> export.zip> export.txt
  • Archivo 3> export.zip> export.txt
  • Padre 2>
  • Archivo 1> export.zip> export.txt
  • Archivo 2> export.zip> export.txt
  • Archivo 3> export.zip> export.txt

Entonces, la carpeta raíz contiene cientos de carpetas principales, cada carpeta principal contiene cientos de archivos, cada archivo contiene un solo archivo zip con el título “export” y cada archivo zip contiene un solo archivo de texto también llamado “export”.

Necesito obtener:

  1. todos esos archivos .txt fuera de los archivos zip,
  2. todos esos archivos .txt con un nombre único usando un método conocido y
  3. trasladados a una ubicación común.

Hasta ahora tengo unos pocos bits del proceso funcionando pero nada que haga las tres cosas. Puedo cambiar el nombre de los archivos zip a algo único, según los nombres de los archivos y padres, haciendo estas dos líneas:

Get-ChildItem -LiteralPath ‘Inserte aquí el directorio raíz’ -Recurse | Rename-Item -NewName { $.Parent.Name+’‘+$_.Name}

y luego

Get-ChildItem -LiteralPath ‘Inserte aquí el directorio raíz’ -Filter *.zip -Recurse | Rename-Item -NewName { $_.Directory.Name+’_’+$_.Name}

Luego intenté algo que encontré aquí para descomprimir los archivos zip, cambiar el nombre de los archivos .txt que contienen y moverlos simultáneamente a una nueva ubicación, pero está generando un error “movefileinfoitemunauthorizedaccesserror microsoft.powershell.commands.moveitemcommand”. He intentado retocarlo pero no puedo hacer que funcione.

Si elimino todo después de “#Mover nuestros archivos temporales”, el error desaparece, pero el resultado aún no es exitoso. Obtiene un solo archivo .txt llamado “export” en la ubicación $TempPath. :

#Ubicación de archivos ZIP definida aquí
$ZipFilesPath = “Inserte aquí el directorio raíz”;

#Descomprimir en carpeta temporal definida aquí
$TempPath = “Inserte aquí la ubicación para poner los archivos .txt aquí”

#Crear nuestro archivo temporal si no existe (se eliminará de nuevo)
Si (!(test-path $TempPath))
{
New-Item -ItemType Directory -Force -Path $TempPath
}

$Shell = New-Object -com Shell.Application
$Location = $Shell.NameSpace($TempPath)
$ZipFiles = Get-Childitem $ZipFilesPath -Recurse -Include *.ZIP
$FileCounter = 1

foreach ($ZipFile in $ZipFiles) {
#Obtener el nombre base del archivo sin la ruta de acceso
$ZipFileActualName = [io.path]::GetFileNameWithoutExtension($ZipFile.FullName)
write-host “Archivo:” $ZipFileActualName
$ZipFolder = $Shell.NameSpace($ZipFile.fullname)
$Location.Copyhere($ZipFolder.items(), 1040)
#Mover nuestros archivos temporales
$txtFiles = Get-ChildItem $TempPath *.txt
$txtFiles |% {Move-Item $_.Fullname “$UnzipPath/$ZipFileActualName.txt”;}
#Mover al siguiente archivo
$FileCounter++
}

¿Alguien puede ayudarme a lograr lo anteriormente mencionado? Abierto a todas las ideas. ¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Puedo ver que has progresado en la tarea de renombrar los archivos ZIP a algo único basado en la carpeta padre y los nombres de archivo. Sin embargo, te has encontrado con desafíos al descomprimir los archivos .txt dentro de esos archivos ZIP, renombrarlos utilizando un método conocido y moverlos a una ubicación de carpeta común.

    Antes de que profundicemos en la solución, tengo algunas preguntas de aclaración:

    1. ¿La ubicación de la carpeta para los archivos .txt extraídos es la misma para todos los archivos o deseas una ubicación de carpeta específica para cada carpeta principal?
    2. ¿Existe un método conocido para renombrar los archivos .txt?

    Una vez que comprenda mejor tus objetivos, puedo proporcionar una solución adecuada.

    Mientras tanto, aquí tienes algunas orientaciones sobre cómo proceder:

    1. Usa el módulo zip en PowerShell para extraer los archivos .txt del interior de los archivos ZIP. Puedes hacerlo con el siguiente comando:
    Expand-Archive -Path C:\path\to\zipfile.zip -DestinationPath C:\destination\folder
    
    1. A continuación, puedes renombrar los archivos .txt utilizando el cmdlet rename-item en PowerShell. Puedes usar el cmdlet get-childitem para recuperar todos los archivos .txt en la carpeta de destino y luego usar el cmdlet foreach-object y el cmdlet rename-item para renombrar cada archivo. Por ejemplo:
    Get-ChildItem -Path C:\destination\folder -Filter *.txt | ForEach-Object {Rename-Item $_.FullName -NewName "newfilename.txt"}
    
    1. Por último, puedes usar el cmdlet move-item para mover los archivos .txt renombrados a la carpeta de destino final.

    Espero que esto te ayude a empezar. Una vez que tenga más información sobre tus requisitos, puedo proporcionar una solución más adaptada.

Comments are closed.