Команда forfiles игнорирует каталог
Я хочу написать пакет, который находит все документы менее 50 МБ в c:\
и скопируйте их в папку, но игнорируйте документы системного каталога. Я предпочитаю даже не искать в системе dir.
Вот мой пакет, который находит и копирует все файлы менее 50 МБ в нужном каталоге, но я не могу сделать это, чтобы игнорировать систему от поиска или 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 ответа
Там нет никакого способа сказать 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%"
Адаптировать эту технику использования 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.
Однако вы можете запустить команду forfiles в c:\users
или домашняя папка конкретного пользователя (%userprofile%
). Вы указываете, чтобы начать с 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 "