Winrar 命令行在不使用通配符时不删除递归

Winrar command line not deleting recursive when not using Wildcards

我正在尝试使用命令行删除 WinRar 存档中的一些文件。

Rar 文件:

/testing.rar
/testing.rar/some-data.txt
/testing.rar/testing/some-data.txt

这是我的代码:

cd "C:\Program Files\WinRAR\" && rar d -cl -r "c:\full\path\testing.rar" some-data.txt

只删除根目录下的some-data.txt文件,不删除/testing/

使用时

cd "C:\Program Files\WinRAR\" && rar d -cl -r "c:\full\path\testing.rar" some-data.*

(将扩展名更改为 .*)它确实删除了两个文件。

我是不是做错了什么?

虽然d命令无法处理,但一个简单的管道就可以处理

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "rar=C:\Program Files\WinRar\rar.exe"
    set "archive=c:\full\path\testing.rar"

    (
        %= List archive contents =%
        "%rar%" lb -ed "%archive%" 
    )|(
        %= filter the list for the file in any subfolder =%
        findstr /i /e /l /c:"\somedata.txt"

        %= and include the root file =%
        echo somedata.txt
    )|(
        %= Delete from archive the list of files read from stdin =%
        "%rar%" d -cl -n@ "%archive%"
    )

第二步(过滤存档中的文件列表)在 findstrecho 中拆分,只是为了防止输出中不存在要删除的文件的情况.如果没有文件列表,-n@ 修饰符(读取要从 stdin 中删除的文件)将不会读取任何内容,所有存档内容都将被删除。

我查看了 MC ND 的第一个版本的优秀解决方案,并自己思考如果偶然出现会发生什么,尽管存档中名称为 some-data.txt 的目录的可能性很小?

答案是这个包含所有文件和子目录的目录也被删除了,因为 Rar.exefindstr 也列出了没有过滤掉目录的列表条目,因为它看起来完全一样就像裸列表格式的文件名条目。

MC ND写的代码的解决方法是使用Rar命令lb和开关-ed来过滤目录条目列表输出。 MC ND 在他的回答中对命令行应用了这个小修改。

然后我想用-ed-x"..."开关过滤掉运行 Rar.exe上不应该删除的目录和文件名,用命令d 和一个 some-data.txt 通配符模式。

这里是单行解决方案:

"C:\Program Files\WinRAR\Rar.exe" d -ed -x"some-data.txt?*" -- "C:\full\path\testing.rar" "some-data.txt*"

文件名末尾的星号是删除存档中所有名称为 some-data.txt 的文件所必需的,包括子目录中的文件。

开关 -ed 排除存档中的所有目录,包括那些偶然命名为 some-data.txt 的目录。存档中以 some-data.txt 开头并附加更多字符的目录,如名称为 some-data.txt_dir 的目录,会被 Rar.exe 使用文件名通配符模式自动忽略。

开关 -x"some-data.txt?*" 导致排除以 some-data.txt 开头并附加了更多字符的文件,如 some-data.txt1some-data.txt10first_some-data.txt 等文件名会被 Rar.exe 使用文件名通配符模式自动忽略。

将文件名转换为小写的开关 -cl 在使用命令 d 时被 Rar 忽略,因此没有在上面的命令行中使用. Rar 将不区分大小写的文件名解释为 Windows。

更新:

Eugene Roshal,win.rar GmbH 的所有者,通过电子邮件告诉我一个更简单的方法来删除根存档文件夹和所有子文件夹中的文件:

"C:\Program Files\WinRAR\Rar.exe" d "C:\full\path\testing.rar" "some-data.txt" "*\some-data.txt"

此命令行仅删除根存档文件夹(最后一个参数)及其所有子文件夹(最后一个参数)中的 some-data.txt。此命令行不会删除名称为 some-data.txt 的文件夹中的文件,但名称为 some-data.txt 的空文件夹也会从存档中删除。可以额外使用开关 -ed 来防止删除空文件夹 some-data.txt.