#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, также называемый «экспорт».
Мне нужно добраться
- все эти файлы .txt из zip-файлов,
- все эти файлы .txt назвали что — то уникальное, используя известный метод, и
- и переместился в общую папку.
До сих пор у меня работало несколько фрагментов процесса, но ничего, что делало бы все три вещи. Я могу переименовать файлы 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
где-то прописали в своем сценарии?