Пакетное перемещение файлов с пробелами в имени.

Я надеюсь, что некоторые могут мне помочь. Я провел последние несколько дней в поисках ответов в Google и ничего не нашел. У меня есть код из двух частей: первый извлекает все из подпапок, а затем вторая часть перемещает эти файлы по типу в другие папки, расположенные в другом месте. Я могу заставить код работать в тестовой настройке, но он не будет работать с файлами, которые я пытаюсь переместить. Я думаю, что это связано с именами файлов, в которых есть пробелы, но я не уверен. Вот коды. Спасибо, парни!

Часть первая

FOR /R C:\Users\Laptop02\Desktop\Folder 1 Test  %%i IN (*.*) DO MOVE %%i C:\Users\Laptop02\Desktop\Folder 1 Test

Вторая часть

@echooff
set media=C:\Users\Laptop02\Desktop\Foder 2 Test
set jpg=C:\Users\Laptop02\Desktop\Foder 2 Test\mediadata
set xml=C:\Users\Laptop02\Desktop\Foder 2 Test\mediadata

move %dlDir%*.avi %media%
move %dlDir%*/*.avi %meia%
move %dlDir%*.mp4 %media%
move %dlDir%*/*.mp4 %media%
move %dlDir%*.mkv %media%
move %dlDir%*/*.mkv %media%
move %dlDir%*.jpg %jpg%
move %dlDir%**.xml %xml%

Спасибо еще раз.


person Idea Bak    schedule 11.12.2012    source источник


Ответы (2)


Хотя команда перемещения хороша и метод, описанный выше, работает, копирование или перемещение большого количества файлов должно быть быстрее с помощью следующей команды robocopy с поддержкой многопоточности:

@echo off
set "source=C:\Users\Laptop02\Desktop\Folder 1 Test"
set "media=C:\Users\Laptop02\Desktop\Foder 2 Test"
set "jpg=C:\Users\Laptop02\Desktop\Foder 2 Test\mediadata"
set "xml=C:\Users\Laptop02\Desktop\Foder 2 Test\mediadata"
robocopy /s /mov /mt "%source%" "%media%" *.avi
robocopy /s /mov /mt "%source%" "%media%" *.mp4
robocopy /s /mov /mt "%source%" "%media%" *.mkv
robocopy /s /mov /mt "%source%" "%jpg%" *.jpg
robocopy /s /mov /mt "%source%" "%xml%" *.xml
pause

Кроме того, было бы быстрее переместить файлы только один раз:

@echo off
set "source=C:\Users\Laptop02\Desktop\Folder 1 Test"
set "media=C:\Users\Laptop02\Desktop\Foder 2 Test"
set "jpg=C:\Users\Laptop02\Desktop\Foder 2 Test\mediadata"
set "xml=C:\Users\Laptop02\Desktop\Foder 2 Test\mediadata"

cd "%source%"
for /r "%~dp0" %%A in (*) do (
    if "%%~xA"==".avi" move "%%~A" "%media%\"
    if "%%~xA"==".mp4" move "%%~A" "%media%\"
    if "%%~xA"==".mkv" move "%%~A" "%media%\"
    if "%%~xA"==".jpg" move "%%~A" "%jpg%\"
    if "%%~xA"==".xml" move "%%~A" "%xml%\"
)
pause
person David Ruhmann    schedule 11.12.2012

Вам нужно заключать в кавычки файлы, в имени которых могут быть пробелы, например.

move "%dlDir%*.avi" "%media%"

ОБНОВЛЕНИЕ

Для части for добавьте

"delims=" 

как это:

FOR /F "delims=" IN (dir /b /s "C:\Users\Laptop02\Desktop\Folder 1 Test")
person Eric J.    schedule 11.12.2012
comment
Нужна помощь с первой частью. По-прежнему не вытаскивает файлы с пробелами в именах из подпапок. - person Idea Bak; 11.12.2012
comment
@IdeaBak: Вы процитировали свою переменную DO MOVE "%%i"? - person Eric J.; 11.12.2012
comment
Ваша Часть 1 выглядит так: FOR /R "C:\Users\Laptop02\Desktop\Folder 1 Test" %%i IN (*.*) DO MOVE "%%i" "C:\Users\Laptop02\Desktop\Folder 1 Test" ? Каждый раз, когда вы используете литеральную строку, содержащую пробелы, пробелы должны быть заключены в окружающие кавычки. - person David Ruhmann; 11.12.2012
comment
@David, это не так, как бы вы ни меняли его на то, что у вас есть, это тоже не сработало. Я благодарю вас за вашу помощь. - person Idea Bak; 11.12.2012
comment
@IdeaBak отображает какие-либо сообщения об ошибках при запуске пакетного сценария? Обычно это может сузить поиск проблемы. Есть ли какие-либо другие специальные символы в именах файлов? "()!& - person David Ruhmann; 12.12.2012
comment
Выглядит так, как будто ничего не происходит, быстро быстро, а потом ничего. - person Idea Bak; 12.12.2012
comment
Вы запускаете скрипт из уже открытой командной строки? В противном случае скрипт немедленно закроется при возникновении ошибки и если в конце скрипта не указан pause. Кроме того, я проверил свой фрагмент, и, кажется, он отлично работает с именами файлов, содержащими пробелы. - person David Ruhmann; 12.12.2012
comment
Нет, я запускаю их как файлы .Bat, потому что я использую планировщик, чтобы делать ходы каждое утро, пока я на работе. - person Idea Bak; 12.12.2012
comment
@IdeaBak: обновил мой ответ. Вам нужно добавить что-то в команду for. - person Eric J.; 12.12.2012
comment
@IdeaBak Хороший метод тестирования bat-файлов при их разработке — открыть консоль cmd и запустить bat-файл в консоли, чтобы все ошибки выводились на экран консоли. - person David Ruhmann; 12.12.2012
comment
@ЭрикДж. К сожалению, я не верю, что опция delims поддерживается рекурсивным режимом /r. По умолчанию для рекурсивного режима весь путь к файлу помещается в указанную переменную. См. technet.microsoft.com/en-us/library/bb490909.aspx ParsingKeywords поддерживается только для режима /f. - person David Ruhmann; 12.12.2012
comment
@DavidRuhmann: вы можете отказаться от /r и вместо этого использовать (dir /b /r). Обновлю свой ответ. - person Eric J.; 12.12.2012