@ECHO OFF
SETLOCAL
:: make destination directory - note quotes as md x y will create directories x and y
MKDIR "U:\cleaned folders\"
:: Read each directoryname in turn from ...\bad folders\ and assign to %%a
:: Examine a dir listing in bare format (/b) of directories (/ad).
FOR /f "delims=" %%a IN ('dir /ad /b "u:\sourcedir\bad folders"') DO (
rem Note REM not :: within a code block (parenthesised sequence of lines)
rem set oldfoldername to the name found
SET "oldfoldername=%%a"
rem partition into newfoldername and number
CALL :split
REM create new destination directory and MOVE file
CALL :cre8move
)
GOTO :EOF
:split
:: initialise destination components
SET "number="
SET "newfoldername=%oldfoldername%"
:splitlp
:: See whether the first character of newfoldername is in the string 0..9
ECHO 0123456789|FIND "%newfoldername:~0,1%">NUL
IF ERRORLEVEL 1 GOTO :EOF
:: first character is numeric - accumulate and remove
SET "number=%number%%newfoldername:~0,1%"
SET "newfoldername=%newfoldername:~1%"
GOTO splitlp
:cre8move
:: create new destination directory
MD "U:\cleaned folders\%newfoldername%"
:: we need to skip (number - 1) lines, so calculate
SET /a skiplines=%number% - 1
:: Read the directorylist (not including directorynames /a-d), skipping number-1 names
:: Move that file (You may want to COPY) and then terminate the loop
FOR /f "skip=%skiplines%delims=" %%q IN ('dir /a-d /b "u:\sourcedir\bad folders\%oldfoldername%\*"') DO (
ECHO MOVE "u:\sourcedir\bad folders\%oldfoldername%\%%q" "U:\cleaned folders\%newfoldername%"&GOTO :eof
)
GOTO :eof
Я считаю, что вышесказанное должно соответствовать вашему странному требованию.Я надеюсь, что повествование в виде комментариев будет полезным.
Вы не говорите, хотите ли вы ПЕРЕДАТЬ или КОПИРОВАТЬ файл.Я только что echo
отредактировал нужную строку.Измените при необходимости.
Обратите внимание, что это не будет работать для каталога, имя которого number
равно 0 или 1. Исправить это значение несложно, если требуется, но продемонстрировать метод для других значений какздесь, похоже, описанный объект.
У Batch есть интересные идеи и о ведущих 0.Если вам нужно сохранить начальные 0, это добавляет немного больше сложностей.
Пакетный синтаксис требует небольшого привыкания.Кажущиеся незначительными изменения могут иметь катастрофические последствия, поэтому копирование и вставка в текстовый редактор, вероятно, является лучшим подходом.Не используйте текстовый процессор, поскольку они имеют привычку переформатировать текст, пытаясь заставить его казаться логичным.
Обратите внимание, что при попытке создать каталог, который уже существует, появляется сообщение об ошибке.будет отображаться.Это безвредно, но безобразно.Вы можете подавить сообщение об ошибке, добавив 2>nul
к каждой строке MD ...
.
Пакет чувствителен к пробелам в операторе SET
.SET FLAG = N
устанавливает переменную с именем «FLAG Пробел » в значение « Пробел N»
Синтаксис SET "var=value"
(где значение может быть пустым)используется, чтобы гарантировать, что любые заданные пробелы НЕ включены в назначенное значение.