2015-10-04 73 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"