使用递归搜索所有目录,将文件解压缩到与归档文件夹相同的文件夹

时间:2011-09-01 03:23:28

标签: powershell recursion tar extraction 7zip

我正在使用PowerShell中的自动化任务,使用递归和7z.exe实用程序将几个.tar存档的内容提取到各自的子文件夹。

我遇到了一个问题,我的工作目录中的输出转储而不是子目录gci -r找到了原始的tarball。

到目前为止,我有:

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

有关在循环或7z提示中设置工作目录的建议表示赞赏。

4 个答案:

答案 0 :(得分:3)

对于powershell而言,我完全无能为力,但在下载了一个庞大的子目录(基本上是“publisher.title.author.year”)之后,每个子目录包含一个或多个zip文件,解压后每个包含一个部分一个多文件rar arhive,最后一次组装,包含一个(无用的名称)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 :(得分:1)

几点:

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
}

答案 2 :(得分:1)

我是OP(制作新的帐号)。谢谢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问题?)。

非常感谢。

答案 3 :(得分:1)

试一试。性能提示,使用Filter参数而不是where-object。

gci -r -filter *.tar | foreach { c:\7z.exe x -y $_.FullName $_.DirectoryName }