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:
- todos esos archivos .txt fuera de los archivos zip,
- todos esos archivos .txt con un nombre único usando un método conocido y
- 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!
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:
¿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:
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.