2

Ситуация:

Многочисленные подпапки со случайными именами папок, содержащие несколько файлов со случайными именами. Одни я хочу сохранить, другие можно удалить.

Цель:

Переместите файлы с расширениями: * .exe * .pdf * .avi или другими указанными расширениями из подпапок в общую отдельную папку, не создавая прежнюю структуру папок. Так что у меня есть одна папка с только файлами, которые я хочу, оставляя позади любые другие типы файлов. Затем запишите имена каталогов подпапок (results-log.log) и удалите подпапки и все, что в них осталось.

Пример; отправной:

  • Parent1
    • sub1
      • random1.exe
      • random2.pdf
      • random3.txt
    • sub2
      • random4.exe
      • random5.avi
      • random6.log
      • random7.jpg

Конечный результат:

  • parent2
    • Результаты-log.log
    • random1.exe
    • random2.pdf
    • random4.exe
    • random5.avi

Поэтому я искал другие ответы, и похоже, что мне нужен какой-то цикл FOR, но я недостаточно понимаю, как это работает с параметрами, чтобы делать то, что мне нужно. Перемещение pdf-файлов в родительскую папку из подпапки с именами переменных является одним из примеров, на который я посмотрел, и просмотрел предлагаемое чтение, но я совершенно не понимаю, как работают параметры и переменные. Особенно там, где мне нужно охватить несколько типов файлов.

Пока я смотрю на что-то вроде этого:

@ECHO OFF
SETLOCAL EnableExtensions
set "_parent=c:\logs\cache\"
set "_dest=c:\archive\"
for /D /r %%G in ("%_parent%\*") do (
  if exist "%%~G\*.pdf" (
    echo move /B "%%~G\*.pdf" "%_dest%\"
  ) else (
    echo nothing to copy "%%~G\*.pdf" "%_parent%\"
  )
)
  • Строка 3 Я полагаю, что устанавливает «c:\logs\cache\» в качестве родительской папки, так что в моем примере об этом будет равно "parent1"
  • В строке 4 следует указать место назначения, например, для папки "parent2" как «c:\archive»
  • Строка 5 является правильной %%G ? Имеет ли значение, что это за письмо?
  • Строка 6, как мне указать другие расширения файлов, которые я хочу найти?
  • В строке 7 я хочу использовать move или что-то еще, и что такое параметр /B ? /y - единственный, кого я знаю о move .

Надеюсь, достаточно информации, можете редактировать по мере необходимости для получения дополнительной информации.

1 ответ1

3

Все, что вам нужно сделать, это сделать несколько заявлений, 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, а используемый синтаксис будет намного проще.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .