forfiles命令忽略目录

时间:2016-01-12 23:12:52

标签: batch-file command-line cmd ignore

我想编写一个批处理,找到c:\中所有小于50 MB的文档,并将它们复制到文件夹中,但忽略系统目录文档。我更喜欢它甚至不在系统目录中搜索。

这是我的批处理,它找到并复制了右边目录中少于50 mb的所有文件,但我不能忽略搜索系统或C:\Windows目录。

@ECHO off
:: variables

SET odrive=%odrive:~0,2%
SET backupcmd=xcopy /s /c /d /e /h /i /r /y

MKDIR "C:\Users\Documents\USBBackups\DOC\C"

forfiles /P C:\ /M *.DOC* /S /C "cmd /c if @fsize leq 50000000 echo @PATH "  > "C:\Users\Documents\USBBackups\DOCC.txt"
FOR /F "tokens=*" %%a in (C:\Users\Documents\USBBackups\DOCC.txt) do xcopy %%a "C:\Users\Documents\USBBackups\DOC\C" /c /h /i /r /y

@ECHO off

2 个答案:

答案 0 :(得分:3)

提供切换forfiles时,无法告诉/S排除某些目录。你必须编写自己的代码才能做到这一点。

由于性能不佳,我不会使用forfiles,而是使用标准for

@echo off
for /D %%D in ("%SystemDrive%\*.*") do (
    if /I not "%%D"=="%SystemRoot%" (
        pushd "%%D"
        for /R %%F in ("*.doc?") do (
            if %%~zF LEQ 50000000 (
                echo %%F
            )
        )
        popd
    )
)

此处根目录级别由for /D枚举。除%SystemRoot%之外的所有目录都由for /R递归枚举。

我将搜索模式从*.doc*更改为*.doc?,以便不包含以.doc.lnk结尾的文件,我想您不想检索这些文件。

您可以直接将echo命令行作为复制源提供xcopy,而不是"%%F"命令。

您可以在命令提示符中直接执行相同的操作,如下所示:

for /D %D in ("%SystemDrive%\*.*") do @if /I not "%D"=="%SystemRoot%" pushd "%D" & (for /R %F in ("*.doc?") do @if %~zF LEQ 50000000 echo %F) & popd

我建议不要遍历整个目录树,然后再按findstr /V /I /L /B /C:"%SystemRoot%"之类的内容进行过滤,因为在这种情况下,你会浪费时间枚举之后忽略的大量项目。

但是,如果您确实想依赖forfiles /S,那么工作命令行如下所示:

2> nul forfiles /S /P "C:\\" /M "*.doc*" /C "cmd /C if @isdir==FALSE if @fsize LEQ 50000000 echo @path" | findstr /V /I /L /B /C:"\"%SystemRoot%"

答案 1 :(得分:0)

采用这种使用findstr过滤掉某些名称的技巧。

查看文档中文件夹的大小,不包括音乐,视频或图片文件夹。

for /f "skip=3 tokens=3" %A in ('Reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Personal"') do set doc=%A

for /f "usebackq tokens=2* delims= " %i IN (`dir "%doc%" /a /s ^|findstr /i /v "\/"^|findstr /l /v "Pictures Music Video"`) DO @echo %j&echo.

但是,您可以在c:\users或特定用户主文件夹(%userprofile%)中启动forfiles命令。您指定从c:\开始,其中包括所有文件夹。

forfiles /P %userprofile% /M .DOC /S /C "cmd /c if @fsize leq 50000000 echo @PATH "
forfiles /P c:\users /M .DOC /S /C "cmd /c if @fsize leq 50000000 echo @PATH "