Powershell — Распакуйте все архивированные файлы в каталоге, а также переименуйте их на основе имен родительских файлов

#powershell #copy #rename #unzip

#powershell #Копировать #переименовать #расстегнуть

Вопрос:

У меня есть папка и набор файлов, таких как:

  • Корень gt;
  • Родитель 1 gt;
  • файл 1 gt; export.zip gt;gt; export.txt
  • файл 2 gt; export.zip gt;gt; export.txt
  • файл 3 gt; export.zip gt;gt; export.txt
  • Родитель 2 gt;
  • файл 1 gt; export.zip gt;gt; export.txt
  • файл 2 gt; export.zip gt;gt; export.txt
  • файл 3 gt; export.zip gt;gt; export.txt

Таким образом, корневая папка содержит сотни родительских папок, каждая родительская папка содержит сотни файлов, каждый файл содержит один zip-файл с заголовком «экспорт», и каждый zip-файл содержит один файл .txt, также называемый «экспорт».

Мне нужно добраться

  1. все эти файлы .txt из zip-файлов,
  2. все эти файлы .txt назвали что — то уникальное, используя известный метод, и
  3. и переместился в общую папку.

До сих пор у меня работало несколько фрагментов процесса, но ничего, что делало бы все три вещи. Я могу переименовать файлы zipfiles в нечто уникальное, основанное на именах файлов и родителей, выполнив эти две строки:

Get-ChildItem -LiteralPath 'C:Insert Root Directory here' -Recurse | Rename-Item -NewName { $_.Parent.Name '_' $_.Name}

и затем

Get-ChildItem -LiteralPath 'C:Insert Root Directory here' -Filter *.zip -Recurse | Rename-Item -NewName { $_.Directory.Name '_' $_.Name}

Затем я попробовал что-то, что я нашел здесь, чтобы распаковать файлы zipfiles, переименовать файлы .txt, которые они содержат, и одновременно переместить их в новое место, но это ошибка с ошибкой «movefileinfoitemunauthorizedaccesserror microsoft.powershell.commands.moveitemcommand». Я пытался повозиться с ним, но не могу заставить его работать. Если удалить все после «#Переместить наши временные файлы», ошибка исчезнет, но результаты все равно не будут успешными. Я получаю один файл .txt с именем экспорт в папке $tempPath. :

 $ZipFilesPath = "C:Insert Root Directory here"; #Unzip To Temp Folder Defined Here $TempPath = "C:Insert Location to put .txt files here"  #Create Our Temp File If It Doesnt Exist (Will Be Deleted Again) If(!(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) {  #Get The Base Filename without the Filepath  $ZipFileActualName = [io.path]::GetFileNameWithoutExtension($ZipFile.FullName)  write-host "File: " $ZipFileActualName  $ZipFolder = $Shell.NameSpace($ZipFile.fullname)  $Location.Copyhere($ZipFolder.items(), 1040)  #Move Our Temp Files  $txtFiles = Get-ChildItem $TempPath *.txt  $txtFiles |% {Move-Item $_.Fullname "$UnzipPath/$ZipFileActualName.txt"}  #Move Along to Next File  $FileCounter   }  

Может ли кто-нибудь помочь мне достичь вышеуказанного? Открыт для любых идей. Спасибо!

Ответ №1:

Expand-Archive в PS 5.1 или выше это должно помочь упростить то, что вы ищете:

 $dst = "c:destination" $tmp = "c:temporary"  # Get a list of all the zip files Foreach ($zipfile in (Get-ChildItem "C:source*.zip" -Recurse)) {   # Extract the 'extract.txt' file to your temp folder  Expand-Archive -Path $zipfile -DestinationPath $tmp -Force   # Move the extract.txt to your destination folder  # And rename based on the source folder and zip file name  Move-Item -Path "$tmpexport.txt" -Destination "$dst$($zipfile.Directory.BaseName)$($zipfile.BaseName).txt"  }  

MoveItem Ошибка, скорее всего, связана с тем, что этот путь неверен: "$UnzipPath/$ZipFileActualName.txt" . Это не похоже на то, что вы $UnzipPath где-то прописали в своем сценарии?