代码之家  ›  专栏  ›  技术社区  ›  Adam Lacey

多程序文件夹中特定子文件夹中的forfiles

  •  0
  • Adam Lacey  · 技术社区  · 9 年前

    当这样的子文件夹位于多个位置时,是否可以只显示名为“导出”的文件夹中的文件?

    这将显示所有 .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\1\Exports\Excel\                   - (Do display .xlsx files)
    %~dp0\1\Do Not Delete\Excel\             - (Don't display .xlsx files)
    %~dp0\2\Exports\Excel\                   - (Do display .xlsx files)
    %~dp0\2\Do Not Delete\Excel\             - (Don't display .xlsx files)
    

    文件夹的数量可能是一个变量,这就是为什么 *\ 正在尝试中。

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

    2 回复  |  直到 9 年前
        1
  •  0
  •   aschipfl    9 年前

    您可以使用两个嵌套 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* (您可以将此模式替换为 Export Exports ,取决于您的需求);为了避免需要 嵌套循环。无论如何,如果迭代项是一个目录,则子目录 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"
    

    这个 for文件 命令向STDOUT返回一个空行,所以上面的命令行将包含其中的许多行;为了避免这种情况,请重定向STDERR STDOUT至 核反应堆 设备并仅将所需数据重定向到控制台 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"
    
        2
  •  0
  •   Paul Jim    9 年前

    您可以使用 | FINDSTR 这样地:

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

    因此,您可以搜索位于特定路径(此处是当前目录)中的所有xlsx文件。每个xlsx必须包含导出为文件夹,并显示不包含的所有xlxx( /V 仅显示不匹配的行)包含“删除”( /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