我想编写一个批处理,找到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
答案 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 "