对于多个文件夹中某些子文件夹中的文件

forfiles in certain subfolder in multipule folders

当这样的子文件夹位于多个位置时,是否只显示名为 "Export" 的文件夹中的文件?

这将在我 运行 批处理文件所在的位置下方显示所有 .xlsx 文件,但是我不想显示所有文件,我只想显示名为的文件夹中的内容"Export":

forfiles -p "%~dp0\" -s -m *.xlsx -d -365 -c "cmd /c ECHO @relpath"

我尝试过类似的事情:

forfiles -p "%~dp0\*\Export" -s -m *.xlsx -d -365 -c "cmd /c ECHO @relpath"

但是它不识别这样的语法。说 invalid argument/option,但在我将 *\ 添加到路径之前它们是有效的。 这是我正在使用的结构示例以及要显示的结果:

%~dp0\Exports\Excel\                   - (Do display .xlsx files)
%~dp0\Do Not Delete\Excel\             - (Don't display .xlsx files)
%~dp0\Exports\Excel\                   - (Do display .xlsx files)
%~dp0\Do Not Delete\Excel\             - (Don't display .xlsx files)

文件夹数量在某种程度上是一个变量,这就是我尝试 *\ 的原因。

当我知道它选择了正确的文件时,我将编辑它以删除文件。

您可以像这样将 | 的结果发送到 FINDSTR

FORFILES /P . /S /M *.xlsx /D -365 /C "CMD /C ECHO @path" | ^
    FINDSTR "\Exports\" | ^
    FINDSTR /I /C:Delete /V

所以你搜索位于特定路径的每个 xlsx 文件(这里是当前目录)每个 xlsx 必须包含导出为文件夹并显示每个不包含的 xlsx(/V 仅显示不匹配的行) 包含 "delete" (/I 表示不敏感)

在批处理文件中,您可以将 /P . 替换为任何可变路径 /P "%~dp0" /P "%CD%" 或作为参数发送 /P %1

您也可以使用 FOR 循环为每场比赛制作任何命令。

在一行中放入控制台:

FOR /F "usebackq delims=" %A in (`forfiles /p . /s /m *.xlsx /D -365 /C "cmd /c ECHO @path" ^|FINDSTR "\Exports\" ^|FINDSTR /I /C:Delete /V`) DO @ECHO FAKE-COMMAND %A

在批处理文件中:

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "usebackq delims=" %%A in (
        `forfiles /p . /s /m *.xlsx /D -365 /C "cmd /c ECHO @path" ^|FINDSTR "\Exports\" ^|FINDSTR /I /C:Delete /V`
    ) DO (
    SET "myfile=%%~A"
    @ECHO FAKE-COMMAND "!myfile!"
)
ENDLOCAL   
GOTO :EOF

您可以使用两个嵌套的 forfiles 循环:

forfiles /S /P "%~dp0\" /M "Export*" /C "cmd /C if @isdir==TRUE forfiles /P @path\Excel /M *.xlsx /D -365 /C 0x22cmd /C echo 00x7840path0x22"

此命令行递归遍历给定的根目录 (%~dp0) 并遍历所有匹配 Export* 的项目(您可以将此模式替换为 ExportExports,取决于您的需要);不检查层级深度以避免需要 ot three 嵌套循环。无论如何,如果迭代项是目录,则枚举子目录 Excel 并搜索匹配 *.xlsx.

的项

补充:

以上命令行可能会显示许多错误消息,如 ERROR: The specified directory does not exist.ERROR: Files of type "*.xlsx" not found.,具体取决于您的数据;为了避免它们,将 STDERR 重定向到 nul 设备:

2> nul forfiles /S /P "%~dp0\" /M "Export*" /C "cmd /C if @isdir==TRUE forfiles /P @path\Excel /M *.xlsx /D -365 /C 0x22cmd /C echo 00x7840path0x22"

forfiles命令returns一个空行到STDOUT,所以上面的命令行会包含很多;为了避免这种情况,将 STDERR STDOUT 重定向到 nul 设备并仅将所需数据重定向到控制台 con:

1> nul 2>&1 forfiles /S /P "%~dp0\" /M "Export*" /C "cmd /C if @isdir==TRUE forfiles /P @path\Excel /M *.xlsx /D -365 /C 0x22cmd /C 1> con echo 00x7840path0x22"