Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 7-Zip为匹配*的文件夹关闭递归*_Windows_Batch File_7zip - Fatal编程技术网

Windows 7-Zip为匹配*的文件夹关闭递归*

Windows 7-Zip为匹配*的文件夹关闭递归*,windows,batch-file,7zip,Windows,Batch File,7zip,我使用的是7-Zip 19.00 64位。我想压缩文件夹中的文件,但不包括子目录;禁用递归 我正在执行的命令: 7z u -mx9 -r- -bd wwwroot.7z C:\inetpub\wwwroot\*.* C:\inetpub\wwwroot\将在其中包含以域命名的子目录 C:\inetpub\wwwroot\domain.com (directory) C:\inetpub\wwwroot\domain.org (directory) C:\inetpub\wwwroot\doma

我使用的是7-Zip 19.00 64位。我想压缩文件夹中的文件,但不包括子目录;禁用递归

我正在执行的命令:

7z u -mx9 -r- -bd wwwroot.7z C:\inetpub\wwwroot\*.*
C:\inetpub\wwwroot\将在其中包含以域命名的子目录

C:\inetpub\wwwroot\domain.com (directory)
C:\inetpub\wwwroot\domain.org (directory)
C:\inetpub\wwwroot\domain.net (directory)
C:\inetpub\wwwroot\images (directory)
C:\inetpub\wwwroot\javascript (directory)
C:\inetpub\wwwroot\index.html
C:\inetpub\wwwroot\robots.txt
C:\inetpub\wwwroot\favicon.ico
7-Zip包含与通配符匹配的子目录;domain.com、domain.org、domain.net将位于wwwroot.7z中。图像和javascript将被排除在外。index.html、robots.txt和favicon.ico将如预期的那样位于wwwroot.7z中

因为站点/域的文件夹会随着时间的推移而改变,所以我无法硬编码要排除的文件夹列表

我尝试过使用以下方法,但没有一种方法能达到我的目的:

7z u -mx9 -r- -bd wwwroot.7z C:\inetpub\wwwroot\.
7z u -mx9 -r- -bd wwwroot.7z C:\inetpub\wwwroot\
我在文档中查找了按属性排除的方法,但没有找到。我看过-x选项,但它似乎只适用于文件

我运行此操作的系统是Windows Server 2012 R2

@Mofi:wwwroot.7z应该只包含文件,而不包含子目录

要使用WinRAR完成此任务,我将使用以下命令:

rar u -ma5 -m5 -ep1 C:\inetpub\wwwroot\wwwroot.rar C:\inetpub\wwwroot\*.*
可以使用
dir
的输出创建一个列表文件,它可以给出一个文件列表
pushd
进入目标目录并运行
7z
%cd%
将保持不变,因为未使用延迟扩展,即与
一起使用!cd。如果要使用脚本目录而不是当前目录,请使用
%~dp0
更改
%cd%


列表文件可以为您提供所需的灵活性

仅将指定目录中的文件以非递归方式压缩到7-Zip存档中的解决方案是:

7z.exe u -mx9 -bd -x!*\ -- wwwroot.7z C:\inetpub\wwwroot\*
开关
-x*\导致排除目录
C:\inetpub\wwwroot
中的所有目录以及这些目录中的所有文件。7-Zip甚至不尝试使用此开关访问上的一个子目录,因为它可以通过Sysinternals(Microsoft)免费工具看到

使用通配符
*
代替
*.
将没有文件扩展名的文件压缩到存档文件中。7-Zip帮助页命令行语法解释了
*
*.
与解释
*.*.
的Windows的区别,Windows总是像
*
一样解释
*.
。WinRAR对
*.
的解释也不同于
*
,如7-Zip,因此与Windows相比也不同


注意:我不明白为什么默认开关
-r-
即使在命令行上显式使用,也不会导致忽略所有子目录中的所有文件,根据使用7-Zip 19.00(x86或x64版本)时的帮助页面上的解释-r(递归子目录)开关
-r-
使用
*.txt
而不仅仅是
*
。因此,如果使用通配符模式
*
*
并使用隐式默认值
-r-
,或者在命令行上显式指定此开关,则在子目录中添加文件的行为看起来要么是7-Zip 19.00的错误,要么是设计有意的不良记录行为。

该命令由于
7z
是一个全名为
7z.exe
的可执行文件,因此不需要调用
。Windows命令处理器等待批处理文件中的可执行文件运行终止,然后继续批处理文件中的下一个命令(行)。@Mofi,7-Zip安装程序未在
%PATH%
中安装
7z.exe
。我在
%PATH%
中确实有一个
7z.cmd
,因此我确实需要使用
调用
来完成脚本。我没有从脚本中删除
call
,因为我不知道OPs环境。使用
call
7z
.bat
.cmd
.exe
文件一起工作。你对我的环境的陈述是错误的。好吧,你现在删除了关于你(现在已删除)评论的
-r0
开关,尽管我不得不承认
-x!*\
和(默认)选项
-r-
在我看来非常不合逻辑,因为我希望根本不会检测到通配符;但即使是
-r-x!*\意外工作。无论如何,我完全同意你的看法,
-r-
本身就足以防止递归…@aschipfl是的,你是对的。开关
-r
-r-
-r0
对使用通配符模式
*.
*
没有影响。开关
-x*\就足够了,因为我在写答案之前在测试中发现了这一点。我想写一个7-Zip错误报告,但在这个线程之前,7-Zip的作者回答了这个问题,并提供了使用
-x*\。在7-Zip讨论论坛中,还有许多关于递归的类似线程。看来这已经是很多年前的事了。谢谢@Mofi将深入7-zip论坛。这是让它工作的最简单的方法。我确实从命令中删除了“-”,因为它似乎不需要。如果是,请回复此评论并解释原因。@ScottJibben开关
--
停止解析开关的参数。在这种情况下不需要它,因为存档文件名
wwwroot.7z
不以
-
开头,而路径为
C:\inetpub\wwwroot\*
的通配符模式也不以
-
开头。但是,用
-->
标记开关列表的末尾,并按照建议将所有开关指定为
-->
和存档文件名,这是绝对正确的,因此我总是在使用7-Zip、WinRAR或RAR的命令行上使用此开关。
7z.exe u -mx9 -bd -x!*\ -- wwwroot.7z C:\inetpub\wwwroot\*