2015-10-04 3 views
0

У меня возникли проблемы с командой FOR DO в файле .BAT, над которым я работаю. Вот весь код, я работаю сАнализ с помощью команды FOR в файле .BAT

SET parent="%~dp0" 
SET GroomedDir="%~dp0Groomed\" 
XCOPY /s/e/y Groomed %parent%NewGroomed\ 
CD NewGroomed 

setlocal enabledelayedexpansion 

    FOR %%i in (IMG_*.jpg) DO (
    SET OldName=%%i 
    SET ImgNumber=!OldName:~4,-4! 
    SET DBLookup=FINDSTR !ImgNumber! Database.txt 

!DBLookup! > return.txt 

    FOR /F "tokens=1-5 delims=|" %%J in (return.txt) do (

 REN !OldName! "%%K_%%L.jpg" 
     MKDIR %%M\%%N 
     MOVE "%%K_%%L.jpg" %%M\%%N 
    ) 

) 
del return.txt 
endlocal 
cd .. 
ren Groomed "Groomed Backup" 
ren NewGroomed Groomed 

Беда придет в строках 12-14 (я ставлю в разделители строк). Я не могу поместить переменную% DBLookup% в команду FOR, и вместо этого я вынужден вместо этого использовать текстовый файл-заполнитель. В конце концов, это работает, но не лучше ли сохранить операцию записи в return.txt и прочитать операцию return.txt?

Для связи return.txt содержит одну строку из текста, как это:

115525 | Last_First | 5233 | 8 | Учитель

Я использую для команды, потому что это позволяет мне разграничить с помощью символ трубы или что-то еще, и выводятся в переменные %% J %% K %% L %% M и %% N.

Любая помощь или совет для этого родственника новенького очень ценится!

Вот мой код с моими комментариями:

REM THESE FOUR LINES: 
    REM 1) SET A VARIABLE FOR THE PARENT DIRECTORY LOCATION, 
    REM 2) SET A VARIABLE FOR THE GROOMED DIRECTORY, 
    REM 3) COPY THE GROOMED DIRECTORY TO "NEWGROOMED\", 
    REM 4) CHANGE THE LOCATION TO BE WORKING ENTIRELY WITHING NEWGROOMED\ 
SET parent="%~dp0" 
SET GroomedDir="%~dp0Groomed\" 
XCOPY /s/e/y Groomed %parent%NewGroomed\ 
CD NewGroomed 

    REM THIS FOR LOOP LOADS ALL JPGS IN THE \NEWGROOMED\ DIRECTORY THAT BEGIN WITH THE STRING, "IMG_" 

setlocal enabledelayedexpansion 

    FOR %%i in (IMG_*.jpg) DO (
    SET OldName=%%i 
    REM THIS LINE COPIES THE OLD NAME MINUS THE FIRST FOUR CHARACTERS, "IMG_", AND MINUS THE EXTENSION (LAST 4 CHARS) 
    SET ImgNumber=!OldName:~4,-4! 
    REM THESE NEXT TWO LINES LOOK UP OUR IMAGE NUMBER IN DATABASE.TXT AND RETURN THE ENTIRE LINE TO A NEW FILE CALLED RETURN.TXT 
    SET DBLookup=FINDSTR !ImgNumber! Database.txt 
    !DBLookup! > return.txt 
    REM NOW WE PARSE RETURN.TXT USING PIPE DELIMITERS INTO THE VARIABLES J,K,L,M,N (ID,Name,IMG#,Grade,Homeroom) 
    FOR /F "tokens=1-5 delims=|" %%J in (return.txt) do (
     REN !OldName! "%%K_%%L.jpg" 
     MKDIR %%M\%%N 
     MOVE "%%K_%%L.jpg" %%M\%%N 
    ) 
) 
del return.txt 
endlocal 
cd .. 
ren Groomed "Groomed Backup" 
ren NewGroomed Groomed 

В целом, моя цель состоит в том, чтобы начать с папкой «ухоженная» с кучей картинок титулованных как таковой: IMG _ #### JPG..

Моего пакетный файл:

1) создать резервную копию всей исходной директории

2) переименовать каждое изображение в соответствии с database.txt файлом

3) переместить каждое переименованное изображение в папка нового класса/чашечки

Я начинаю с файла (database.txt), который приходит ко мне от другого сотрудника. Файл представляет собой простой список для каждого учащегося в следующем формате: student id | lastname_firstname | image # | grade # | teahername.

Как я упомянул. Файл работает отлично, но поскольку я новичок в пакетных файлах, я чувствовал, что мне может быть неловко писать в файл-файл, чтобы сохранить строку, а затем удалить ее. Это переменные, но мне пришлось с трудом перебирать эту переменную в команду FOR.

образец Database.txt

659968|Saperstein_Ryan|4603|7|Hallock 
015520|Qian_Emily|2528|7|Hallock 
528852|Rizzo_Jason|4618|7|Krukowski 

и несколько имен файлов, я начинаю с:

IMG_2528.jpg 
IMG_4544.jpg 
IMG_7044.jpg 
IMG_6880.jpg 
IMG_4839.jpg 
+0

Эй Пол, я вставить свою комментировал версию в большом блоке в конце моего вопроса. БЛАГОДАРЯ! – Chucksef

+0

Редактировать: здесь форматы плохо, поэтому я добавлю его в конец вопроса еще раз! – Chucksef

+0

Точно исправить при переименовании. Я хочу знать, как объединить имя файла и одновременно удалить Img_. – Chucksef

ответ

0

Edit:

Первая связка разбором database.txt первый а затем сравните с помощью if exist.Во-вторых, путем сравнения переменных

Код:

rem create a sample of the following example 
rem :: student id|lastname_firstname|image#|grade#|teachername 
rem :: The common points are only in the first 3 jpg 

copy nul IMG_4603.jpg 
copy nul IMG_2528.jpg 
copy nul IMG_4618.jpg 
copy nul IMG_4619.jpg 
copy nul IMG_4620.jpg 
copy nul IMG_4630.jpg 


(
echo 659968^|Saperstein_Ryan^|4603^|7^|Hallock 
echo 015520^|Qian_Emily^|2528^|7^|Hallock 
echo 528852^|Rizzo_Jason^|4618^|7^|Krukowski 
echo 528817^|Rizzo_Jas17^|4617^|7^|Krukows17 
echo 528816^|Rizzo_Jas16^|4616^|7^|Krukows16 
)>sample.txt 

rem :: type sample.txt 
rem :: pause 

Метод # 1

@echo off 
setlocal enabledelayedexpansion 
for /f "tokens=1-5 delims=|" %%a in (sample.txt) do (
    set "student_id=%%a" 
    set "student_name=%%b" 
    set "student_image=%%c" 
    set "student_grade=%%d" 
    set "student_teacher=%%e" 
    rem :: echo !student_name!_!student_image!.jpg 

    if exist "IMG_!student_image!.jpg" (
    rem :: remove echo in the following lines if it's okay. 
    echo: 
    echo ren "IMG_!student_image!.jpg" "!student_name!_!student_image!.jpg" 
    echo mkdir "!student_grade!\!student_teacher!" 
    echo move "!student_name!_!student_image!.jpg" "!student_grade!\!student_teacher!" 
) 
) 

Метод # 2

@echo off 
setlocal enabledelayedexpansion 
for %%i in (IMG_*.jpg) do (
    set "OldName=%%~i" 
    set "image_number=!OldName:~4,-4!" 
    rem :: echo image_number: !image_number! 

    for /f "tokens=1-5 delims=|" %%b in (
    'findstr !image_number! sample.txt' 
) do (
    set "student_id=%%a" 
    set "student_name=%%b" 
    set "student_image=%%c" 
    set "student_grade=%%d" 
    set "student_teacher=%%e" 

    if "!student_image!"=="!student_image!" (
     rem :: remove echo in the following lines if it's okay. 
     echo: 
     rem :: echo !image_number! = !student_image! 
     echo ren "IMG_!student_image!.jpg" "!student_name!_!student_image!.jpg" 
     echo mkdir "!student_grade!\!student_teacher!" 
     echo move "!student_name!_!student_image!.jpg" "!student_grade!\!student_teacher!" 
    ) 
) 
) 

выход:

ren "IMG_2528.jpg" "Qian_Emily_2528.jpg" 
mkdir "7\Hallock" 
move "Qian_Emily_2528.jpg" "7\Hallock" 

ren "IMG_4603.jpg" "Saperstein_Ryan_4603.jpg" 
mkdir "7\Hallock" 
move "Saperstein_Ryan_4603.jpg" "7\Hallock" 

ren "IMG_4618.jpg" "Rizzo_Jason_4618.jpg" 
mkdir "7\Krukowski" 
move "Rizzo_Jason_4618.jpg" "7\Krukowski" 
Смежные вопросы