7-zip 和 Windows 7:双击时将“解压缩到 <文件夹>”设为默认值

sch*_*dge 18 windows-7 7-zip

我试图找到一种方法来使您可以从上下文菜单中执行的操作,“提取到<folder_same_as_file_name>”双击文件时的默认操作,而不是简单地启动 7-zip。有没有一种简单的方法可以做到这一点?

或者,我认为我可以尝试将参数传递给以下内容:

7z x <filename> -o<filename>

但我不确定如何设置(如何传递文件名参数,我可以直接这样做还是我必须编写一个批处理文件并将文件名传递给它?后者我觉得很不雅观,但是无论什么工作。

小智 14

由于相互矛盾的答案,这个线程变得有点混乱(我花了很长时间才弄清楚哪个是正确的解决方案)所以我认为将 afrazier 和 Justin Roettger 的帖子的结果与我自己的帖子相结合可能是一个好主意经验:

  1. 以管理员身份启动 regedit
  2. 打开 HKEY_CLASSES_ROOT\7-Zip.7z
  3. 在该键下,展开Shell子键
  4. (Default)值设置为字符串extract
  5. 创建一个名为的新子键 extract
  6. 将键的(Default)值设置extractExtract to Folder
  7. extract命名下创建一个新的子项command
  8. 将键的(Default)值设置command为:

C:\Program Files\7-Zip\7zG.exe x "%1" -o*

(您可能需要调整它以匹配您的 7-Zip 安装路径)

Justin Roettger 建议我最终使用 7zG,而不是带有 -aou 的 7z,因为这样您可以选择覆盖,如果您喜欢,就像使用普通上下文菜单提取一样。

就是这样!7z 文件现在可以通过双击以自己的名称提取到一个文件夹中。对于 .rar 和 .zip 等其他扩展名,您需要为相应的键重复这些步骤。(即 HKEY_CLASSES_ROOT\7-Zip.rar 和 HKEY_CLASSES_ROOT\7-Zip.zip 等)

哦,澄清一下:它也适用于选择的多个文件。不需要批处理文件。

  • 在 Windows 10 上,我也没有看到该路径,直到我在 7-Zip 文件管理器中将至少一个文件与 7-Zip 关联起来(通过“工具 -&gt; 选项...”菜单)。 (3认同)

afr*_*ier 5

简单的方法

安装ExtractNow。您可以将其配置为完全按照您的意愿行事。


艰难的道路

手动修改注册表如下...

  • regedit以管理员身份启动

  • 打开HKCR\.7z并查看(Default)值。请注意那是什么(就我而言,作为 PowerArchiver 用户,它是PASZIP

  • 转到HKCR名为 that的注册表项。(在我的情况下HKCR\PASZIP

  • 在该键下,展开Shell子键

  • (Default)值设置为字符串extract

  • 创建一个名为的新子键 extract

  • 将键的(Default)值设置extractExtract to Folder

  • extract命名下创建一个新的子项command

  • 将键的(Default)值设置command

    C:\Program Files\7-Zip\7zG.exe x "%1" -o* -aou
    
    Run Code Online (Sandbox Code Playgroud)

    (您可能需要调整路径)

感谢 Justin Roettger 指出为此所需的正确名称变量。

应该是这样。现在,通过双击将 7z 文件解压缩到具有自己名称的文件夹中。对于 .rar 和 .zip 等其他扩展名,您需要对相应的键重复此步骤。

如果您只想对您的用户帐户而不是系统范围进行更改,请修改HKCU\Software\Classes而不是HKCR. HKCR是这是一个联合的虚拟键HKLM\Software\Classes,并HKCU\Software\Classes在帐户中的数据(HKCU)覆盖全系统的数据(HKLM)。通常以管理员身份运行 regedit 意味着修改 HKCR 会更改 HKLM 中的系统范围数据。


提取多个文件

当然,如果您选择了多个文件,这将不起作用。如果你想让它工作,你需要创建以下批处理文件:

@echo off
:top
if "%1"=="" goto :EOF
7z.exe x "%1" -o"%~dpn1"
shift
goto top
Run Code Online (Sandbox Code Playgroud)

现在,请按照上面的说明进行操作。在最后一步,将键的(Default)值设置commandC:\Path\To\File.bat %*

所有注册表修改都未经内存测试,但应该是正确的。


小智 5

不幸的是,afrazier 的批处理程序方法不起作用;Windows 不处理这样打开多个文件。当您尝试使用一个程序打开多个文件时,Windows 不会打开该程序的单个实例,而是将这些文件作为多个参数传递给该实例。相反,Windows 会打开程序的许多实例(与文件数量一样多的实例),将一个文件传递给每个实例。如果您可以只使用 %* 并将一堆文件传递给单个 .bat,并让该 .bat 运行一个循环处理每个文件,那就太好了,但不幸的是,您在设置这些文件时只能使用 %1注册表中的各种操作。

有时间的人可以编写一个程序,使用互斥对象来检查是否有另一个实例已经在运行,如果有,则将其文件传递给该实例,然后关闭,原始实例将在该实例上放置该文件在队列中,并在处理完自己的文件后访问它。批处理也可以使用tasklistand 来解决find这个问题,但这不如互斥锁那么好。

无论如何,请为您的提取命令注册表值尝试此操作以获得正确的文件夹名称:

"\path\to\7z.exe" x "%1" -o* -aou
Run Code Online (Sandbox Code Playgroud)

这将在与源存档相同的目录中创建一个与源存档同名的新文件夹(无文件扩展名)。

此外,我添加了-aou自动避免文件名冲突的开关(7z 会在文件末尾附加一个数字,而不是提示您是否要覆盖或其他)。