2011-09-01 104 views
0

我正在使用PowerShell中的一個自動化任務,它使用遞歸和7z.exe實用工具將幾個.tar歸檔的內容提取到其各自的子文件夾。使用遞歸搜索所有目錄將文件解壓縮到同一文件夾

我遇到了輸出轉儲到我的工作目錄而不是子目錄gci -r找到原始tarball的問題。

到目前爲止,我有:在設置循環內的工作目錄,或7z格式的技巧讚賞

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

建議。

回答

1

幾點:

1)使用的,而不是ex標誌保存路徑。

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 
} 
1

我是OP(做了一個新的ACCT)。謝謝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

試試看。性能提示,請使用Filter參數而不是Where對象。

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

我需要使用-o標誌和逃生b C的/在路徑中有空格的目錄名稱:'GCI -r - filter * .tar | foreach {c:\ 7z.exe x -y $ _。FullName -o「$(​​'」'+ $ _。DirectoryName +'「'')」}' – lapropriu

3

我是當它涉及到PowerShell中完全完全一無所知,但下載一個巨大的洪流充滿子目錄(「publisher.title.author.year」基本上)各包含一個或多個zip文件,之後拉開時每個包含一個多文件rar arhive的一部分,最後一次彙編,其中包含一個(無用的名稱)pdf文件...

所以我想出了這個粗略和準備好的腳本,以遞歸到每個子目錄,解壓縮拉到該目錄中,然後組裝rar文件並將pdf提取到該目錄中,然後使用目錄名稱重命名pdf,然後將其移動到一個目錄中(所以最後我以基礎目錄結束l有意義的命名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 .. 
} 
相關問題