Все, что вам нужно сделать, это сделать несколько if
заявлений, я думаю. Так что внутри вашего цикла это будет выглядеть так:
IF exist "%%G\*.pdf" ( move /Y "%%G\*.pdf" "%_dest%\" echo %%G>>"%_dest%\results-log.log ) IF exist "%%G\*.exe" ( move /Y "%%G\*.exe" "%_dest%\" echo %%G>>"%_dest%\results-log.log ) IF exist "%%G\*.avi" ( move /Y "%%G\*.avi" "%_dest%\" echo %%G>>"%_dest%\results-log.log )
Если вы хотите, чтобы сообщение не сообщало о перемещении, вы всегда можете установить некоторую переменную, если она попадет внутрь одного из этих IF
операторов, и проверить, установлено ли оно.
Я не уверен /B
, что, это не выглядит правильным для меня. Я думаю, что вы правы /y
.
G
Может быть любой символ, но он не может быть больше, чем один символ. G
это то, что обычно используется.
Я бы посоветовал изучить скрипты powershell для таких вещей. На мой взгляд, проще и проще делать такие вещи с меньшим количеством строк кода. Может быть команда для перемещения всех файлов с несколькими расширениями одновременно, но из того, что я понимаю, синтаксис обычно не доступен для перемещения в большинстве версий DOS.
РЕДАКТИРОВАТЬ:
Я проверил это локально, и это похоже на то, что вы делаете. Вам нужно будет настроить его для вашего конкретного случая.
@ECHO OFF SETLOCAL EnableExtensions enabledelayedexpansion set _parent=c:\logs\cache\ set _dest=c:\archive\ set found=0 for /R %_parent% %%G in (.) do ( set found=0 IF exist "%%G\*.pdf" ( move /Y "%%G\*.pdf" "%_dest%\" set found=1 ) IF exist "%%G\*.exe" ( move /Y "%%G\*.exe" "%_dest%\" set found=1 ) IF exist "%%G\*.avi" ( move /Y "%%G\*.avi" "%_dest%\" set found=1 ) IF !found!==1 ( rd /s /q "%%G" echo %%G>>"%_dest%\results-log.log" ) ) endlocal
Использование /D
опции в for
цикле присоединяет текущий каталог, в котором вы запускаете скрипт, к %%G
переменной, которую я не думаю, что вы хотите. То, как я написал это выше, в основном гласит, что нужно восстановить все папки в родительском каталоге и установить его %%G
в этом месте (.)
.
Вы должны добавить enabledelayedexpansion
также, чтобы вы могли использовать found
переменную в разных блоках, затем вам нужно вызывать !found!
вместо того, %found%
чтобы использовать ее. Просто странная причуда пакетного скриптинга.
Если весь этот синтаксис кажется вам действительно странным, вы не одиноки. Вам просто нужно провести исследование и просто провести собственное тестирование, чтобы увидеть, что происходит, пока вы не заставите его делать то, что вы хотите. Надеемся, что когда вы перейдете на powershell, вы найдете отладку с использованием powershell ISE, а используемый синтаксис намного проще.