Проблемы с пакетным созданием файлов / папок - PullRequest
2 голосов
/ 10 апреля 2011

Во-первых, я хотел бы поблагодарить любого, кто может помочь заранее, я не делал таких пакетных сценариев в течение многих лет, и быть «ржавым» - преуменьшение.У меня есть много файлов на подключенном диске, с которыми я хочу поработать, не рискуя повредить эти файлы, поэтому я пытаюсь создать локальную версию «фальшивых» файлов, чтобы не навредить, если что-то испортится.

Все это делается на компьютере с Windows 7, поэтому я начал с запуска следующего, чтобы получить полный список каталогов для манипулирования:

dir /b M:\ > movies.txt

Оттуда, если я запускаю следующее, яЯ могу получить отдельные 0-байтовые поддельные файлы на основе строк в 'movies.txt':

for /F "eol=; tokens=1* delims=," %%i in (movies.txt) do @echo.> %%i.avi

Или, если я выполню следующее, я получу пустые каталоги на основе 'movies.txt':

for /F "delims=~" %%f in (movies.txt) DO MD "%%f"

Проблема с любой из этих команд заключается в том, что я либо получаю кучу файлов, все сосредоточенные в корневой папке (первая команда for), либо получаю пустые каталоги (вторая команда for)) но я не могу понять, как получить поддельные файлы в папки.

Примеры: если на подключенном диске "M" есть следующие файлы фильмов:

M:\Las Vegas Trip (2009)\Las Vegas Trip (2009).avi
M:\Las Vegas Trip (2010)\Las Vegas Trip (2010).avi

then 'movies.txt 'будет выглядеть как:

Las Vegas Trip (2009)
Las Vegas Trip (2010)

и первая команда приведет к:

D:\Las Vegas Trip (2009).avi
D:\Las Vegas Trip (2010).avi

или вторая команда приведет к:

D:\Las Vegas Trip (2009)\
D:\Las Vegas Trip (2010)\

Но мне нужно:

D:\Las Vegas Trip (2009)\Las Vegas Trip (2009).avi
D:\Las Vegas Trip (2010)\Las Vegas Trip (2010).avi

Я искал в интернете несколько дней и, похоже, не могу найти ничего, что дало бы мне желаемые результаты ... Я нашел немного похожую «проблему» в другом месте, где они хотели создать папки на основе файла.имя, но они хотели автоматически переименовать имя файла конечного результата, который не будет работать.(Да, я пытался изменить их команду, чтобы работать, но никакие изменения, которые я мог придумать, не дали бы ничего, кроме ошибок.) Вы можете увидеть вышеупомянутый метод здесь (на сайте).

Поправки, которые я предпринял в коде по ссылке, включали:

for /f %%f in ('dir *.png /b') do md %%~nf & move %f .\%%~nf\0000.png <- original
for /f %%f in ('dir *.avi /b') do md %%~nf & move %f .\%%~nf\*.avi
for /f %%f in ('dir *.avi /b') do md %%~nf & move %f .\%%~nf\
for /f %%f in ('dir *.avi /b') do md %%~nf & move %f .\%%~nf

В каждом случае мне выдавалась ошибка в связи с заключительной частью раздела кода "%% ~ nf * .avi".

Любые идеи о том, как изменить этот код, чтобы он работал на меня, или что-то еще, что сработало бы, будут очень благодарны.

------- Отредактированная часть ------- Я попытался изменить свой командный файл, чтобы использовать команду, представленную в посте ниже, и, похоже, она не работает:

cd Movies2
dir /b %MovieSource% > movies.txt
for /f "delims=" %%f in ('dir *.avi /b') do md "%%~nf" & move "%~f" ".\%%~nf\*.avi"
rem for /F "eol=; tokens=1* delims=," %%i in (movies.txt) do @echo.> %%i.avi
rem FOR /F "delims=~" %%f in (movies.txt) DO MD "%%f"

Я также попытался поставить первую команду 'for' второй и unREM'd командудругая команда 'for', чтобы она заранее создала * .avi, думая, что это может сработать, но попытка в любом случае выдает ту же ошибку.

The following usage of the path operator in batch-parameter
substitution is invalid: %~f" ".\%%~nf\*.avi"

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Попробуйте это:

@ECHO OFF

SET oldroot=M:\
SET newroot=D:\newroot\
FOR /R "%oldroot%" %%f IN (*) DO CALL :processfile "%%f"
GOTO :EOF

:processfile
SET "oldfile=%~1"
CALL SET "newfile=%%oldfile:%oldroot%=%newroot%%%"
CALL :checkpath "%newfile%"
ECHO.>"%newfile%"
GOTO :EOF

:checkpath
SETLOCAL EnableExtensions
IF NOT EXIST "%~dp1" MKDIR "%~dp1"
ENDLOCAL
GOTO :EOF
  • Этот скрипт перебирает все файлы по пути, указанному в oldroot.

  • Старый корневой путь в каждом полностью определенном имени файла заменяется путем к новому корневому каталогу (переменная newroot), в результате получается другое полное имя файла (хранится в переменной newfile).

  • Путь к новому файлу проверяется: если он не существует, он создается.

  • Наконец, создается пустой файл с новым именем.

EDIT

Строка ECHO.>"%newfile%" фактически создает файл с символом EOL (0x0D0A) в нем, поэтому размер такого файла равен 2, а не 0. Если вы хотите, чтобы он был 0, вы можете заменить ECHO бит с этой конструкцией:

SET /P somevaryrandomandunusedvarname=>"%newfile%" <NUL
1 голос
/ 10 апреля 2011

Кажется, это проблема в операторе FOR /F, так как он использует стандартные разделители <space> и <TAB>.

Это должно работать с чем-то вроде

for /f "delims=" %%f in ('dir *.avi /b') do md "%%~nf" & move "%~f" ".\%%~nf\*.avi"
...