PowerShell和WinRAR命令行

5

经过一天的搜索,我没有找到关于使用PowerShell和WinRAR命令行提取文件的太多信息。

我的困难在于实际执行参数和命令行。

以下是我目前的简单代码:

$WinRar = "C:\Program Files\WinRAR\winrar.exe"

#filter through files looking for zip files.
$path = get-ChildItem -filter "*.zip" -path A:\testfolder\ -recurse

#test to see if it is actually filtering and showing correct results:
write-host = $path | format-table directory

#arguments :: x (extract) y(presume yes) r(recurse subdir) 
&$WinRar x -y -r "$path" A:\Testfolder\



read-host "press to exit"

我对PowerShell还不是很熟练,但似乎很快就能掌握,但我认为我的代码完全错了,因为它执行时没有提取任何东西。所以我想它在某个地方出错了,但我看不出来它在做什么。

有哪些建议或提示可以指导我走向正确的方向呢?

我尝试了许多$winrar 命令的变化,但都没有成功,除了一个部分,如果我用实际文件路径替换$path,它就有效了...这不是我需要的:P


根据WinRAR帮助文档,我可以判断出WinRAR不允许在命令行中指定多个存档名称。您必须在循环中逐个提取存档。 - user4003407
无法在 WinRAR 的命令行上指定多个存档文件名以提取所有或仅指定的文件/文件夹。但是,可以从包含通配符 *? 的文件名模式匹配的所有存档中提取文件/文件夹。例如,WinRAR x *.zip 将当前目录中的所有 ZIP 存档提取到当前目录中。使用 WinRAR v5.30 或任何更高版本,WinRAR x *\*.zip 从任何子目录中提取所有文件/文件夹到当前目录中,但会忽略当前目录中的 ZIP 存档。 - Mofi
2个回答

5
你可以使用简单的 foreach 方法来实现这个功能:
$Zips = Get-ChildItem -filter "*.zip" -path A:\testfolder\ -Recurse
$Destination = 'C:\Extracted'
$WinRar = "C:\Program Files\WinRAR\winrar.exe"

foreach ($zip in $Zips)
{
&$Winrar x $zip.FullName $Destination
Get-Process winrar | Wait-Process
}

如果您想同时运行多个WinRAR进程,请删除Get-Process行。


1
与CMD不同,PowerShell即使从脚本中调用程序,也不会等待GUI程序完成。因此,您的命令将生成多个并发的WinRAR实例。 - user4003407
@Avshalom 如果我决定将提取的文件保存在它被发现的同一文件夹中,我该怎么做?如果我猜测:&$Winrar x $zip.FullName $zip.directory ?? 提前致谢! - Ben
1
你可以为每个zip创建一个目录,也可以创建一个包含两列(zip名称和目标文件夹)的CSV文件,并从那里加载它。 - Avshalom
打开 WinRAR,从菜单 帮助 中选择选项卡 __内容__,打开项目 __命令行模式__,然后打开 开关 并阅读有关 -ad 开关的页面。例如,使用 WinRAR x -ad "My Archive.zip" 将导致将此存档的所有文件和文件夹提取到当前目录中名为 My Archive 的子目录中,WinRAR 如果不存在,则会自动创建子目录 My Archive - Mofi

0
使用 rar.exe 替代 winrar.exe。它在同一个目录中。
这将确保即使有多个进程运行,也会正确等待进程完成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接