Извлечение файлов в ту же папку, что и архив, используя рекурсивный поиск по всем каталогам - PullRequest
0 голосов
/ 01 сентября 2011

Я работаю над задачей автоматизации в PowerShell, которая извлекает содержимое нескольких архивов .tar в соответствующие подпапки с помощью рекурсии и утилиты 7z.exe.

Я сталкиваюсь с проблемой, из-за которой выводится дампв моем рабочем каталоге вместо подкаталога gci -r нашел оригинальный архив.

Пока у меня есть:

    $files=gci -r | where {$_.Extension -match "tar"}
        foreach ($files in $files) {
            c:\7z.exe e -y $file.FullName }

Советы по настройке рабочего каталога в цикле или советы 7z приветствуются.

Ответы [ 4 ]

3 голосов
/ 18 июля 2012

Я абсолютно ничего не понимаю, когда дело доходит до powershell, но после загрузки огромного потока, полного подкаталогов (по сути, "publisher.title.author.year"), каждый из которых содержит один или несколько zip-файлов, каждый из которых при распаковке содержал частьмногофайлового архива rar и, наконец, когда-то собранного, который содержал (без названия) файл pdf ...

, поэтому я придумал этот грубый и готовый скрипт для повторения в каждом подкаталоге, разархивировал zip-файлы вэтот каталог, затем соберите rar-файлы и извлеките pdf в этот каталог, затем переименуйте pdf с именем каталога и переместите его вверх по каталогу (так что к концу я получил базовый каталог, полный значимых имен pdf-файлов...

в любом случае - как я уже говорил, у меня буквально нет знаний о PowerShell, поэтому я в основном публикую это, потому что потратил впустую два часа на написание (я мог бы сделать это за 5-10 минут в Python или Perl: P) и потому что, если он в сети, я мог бы на самом деле найти его снова, если мне нужнохе-хе

$subdirs = Get-ChildItem | ?{$_.Attributes -match 'Directory'}
foreach ($dir in $subdirs) {
    cd $dir
    $zip get-childitem | where {$_.Extension -match "zip"}
    C:\7z.exe x -y $zip.FullName
    $rar = get-childitem | where { $_.Extension -match "rar"}
    C:\7z.exe x -y $rar
    $pwd = get-item .   
    $newname = $pwd.basename+".pdf"
    get-childitem *.pdf | rename-item -newname $newname
    move-item $newname ..\
    cd ..
}
1 голос
/ 01 сентября 2011

Я ОП (сделал новый акт).Благодаря manojlds, я изменил

$destination = Join-Path (Split-Path -parent $file.FullName) $file.BaseName

на

$destination = Join-Path (Split-Path -parent $file.FullName) $file.DirName

, чтобы вывести в тот же каталог, что и архив, и поддерживать древовидную структуру.Я также настроил

$z ="7z.exe"
...
& ".\$z" x -y $source $destination

на

$z="c:\7z.exe"
...
& "$z" x -y $source $destination

, потому что он выдавал ошибку (проблема 7z?).

Большое спасибо.

1 голос
/ 01 сентября 2011

Дайте это попробовать.Совет по производительности, используйте параметр Filter вместо where-object.

gci -r -filter *.tar | foreach { c:\7z.exe x -y $_.FullName $_.DirectoryName } 
1 голос
/ 01 сентября 2011

Несколько баллов:

1) Используйте флаг x вместо e для сохранения путей.

2) Используйте -o для указания пункта назначения / выхода. Я принимаю папку назначения в качестве имени файла tar (без расширения) и путь к нему совпадает с именем файла tar. Вы можете удалить папку и просто указать путь.

3) Вы просто используете gci -r - он будет искать файлы в текущем каталоге. Я включил $scriptDir ниже, который будет в каталогах путь скрипта. Чтобы обыскать всю машину, сделайте что-то вроде gci c:\ -r

Вот как я это сделаю:

$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$z ="7z.exe"

$files=gci $scriptDir -r | where {$_.Extension -match "tar"}
foreach ($file in $files) {
    $source = $file.FullName
    $destination = Join-Path (Split-Path -parent $file.FullName) $file.BaseName
    write-host -fore green $destination
    $destination = "-o" + $destination
    & ".\$z" x -y $source $destination
}
...