Как я могу извлечь и использовать информацию (значения, строки) ... из имени папки в пакетном файле - PullRequest
0 голосов
/ 28 апреля 2019

Я хотел бы создать командный файл для организации своей папки. По сути, это мой первый код, извините за ошибки.

Имя папки состоит из целого числа и текста, например: «C: \ bad folder \ 22my folder \»

В этом случае я хотел бы создать новые папки с текстом имени папки и файлом в целочисленном ранге в алфавитном порядке. Здесь будет создана папка:

C: \ готовые папки \ моя папка

содержит только файл

C: \ готовые папки \ моя папка \ 22.txt (22-й файл внутри папки)

Вот что я делал до сих пор, но это абсолютно ужасно, я постараюсь все исправить:

MKDIR C:\cleaned folders\
CD C:\bad folders\
            ::I will try and make a loop for all the folders in "C:\bad folders\"

set oldfoldername=%CD%  ::the whole folder name (number+text)
set newfoldername=  ::the text in the folder name
set number=     ::the number in the folder name

mkdir C:\cleaned folders\newfoldername
CD ..


copy C:\bad folders\oldfoldername C:\cleaned folders\newfoldername
CD C:\cleaned folders\newfoldername
      ::loop maybe for all the files in "C:\cleaned folders\newfoldername"
IF (filerank) neq %number% DEL (filerank)

Итак, как я могу получить эту информацию из имени папки и использовать ее? Заранее спасибо.

1 Ответ

0 голосов
/ 29 апреля 2019
@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 Пробел » в значение « Пробел

Синтаксис SET "var=value" (где значение может быть пустым)используется, чтобы гарантировать, что любые заданные пробелы НЕ включены в назначенное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...