我正在使用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提示中设置工作目录的建议表示赞赏。
答案 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 }