2015-10-04 29 views
0

我在使用.BAT文件中的FOR DO命令時遇到了一些問題。 這是我與使用.BAT文件中的FOR命令進行解析

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 |教師

我使用FOR命令,因爲它可以讓我用劃管道字符或其他任何內容,並輸出到%% 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)開始,從另一位員工那裏找到我。該文件是以下格式的每個學生的普通列表:學生ID |姓氏名|圖像#|等級#|教師名。

正如我所提到的。該文件完美地工作,但由於我是批處理文件的新手,我感覺像寫一個一次性文件來保存一個字符串然後刪除它可能是愚蠢的。這就是變量的用途,但我很難讓這個變量進入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

編輯:

第一一束由第一解析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"