批量添加前导零文件名

时间:2017-03-31 08:13:04

标签: batch-file for-loop rename filenames

我有一个脚本,我正在用于各种各样的事情,包括重命名和重新打包漫画。其他人也使用此脚本的变体。

然而,我一直看到重新打包漫画的局限性;我发现有些漫画在他们的页面上没有前导零,这使得页面看起来乱序。所以,我添加了一个应该添加前导零的部分。

该文件执行以下操作:

  1. 循环遍历当前文件夹的所有子文件夹
  2. 将漫画档案重命名为适当的扩展名(所以我可以看到它的位置)
  3. 遍历所有档案,并将其解压缩到临时文件夹
  4. 循环临时文件夹中的所有文件,并添加前导零
  5. 将其重新包装为7zip
  6. 将文件重命名为漫画书扩展名
  7. 不知何故,它没有正确地重命名文件,并且存档的名称在存档中显示为子文件夹。例如: 让我们重新打包'testfolder',其中包含1到100的图像。它重新命名,提取,打包和重命名,没有问题。但是,新存档包含图像旁边的存档中名为“testfolder”的文件夹,该文件夹没有前导零。我不确定发生了什么,我现在已经和它斗争了一段时间,所以我想把它放在网上(无论如何这是一个很好的分享脚本)。有没有人知道这里出了什么问题?

    @ECHO ON
    rem mode con: cols=80 lines=60
    for /f "delims=" %%F in ('dir /ad/s/b') do (
        cd %%F
    
        IF EXIST *.cbr (
            RENAME *.cbr *.rar
        )
    
        IF EXIST *.cbz (
            RENAME *.cbz *.zip
        )
    
        IF EXIST *.cb7 (
            RENAME *.cb7 *.7z
        )
    
        FOR %%I IN (*.RAR, *.ZIP *.7Z) DO (
            ECHO Extracting %%I...
            "C:\Program Files\7-Zip\7z.exe" e "%%I" -oC:\TMPPACKDIR\* -y | FIND /V "ing  "
    
            echo %%~nI
            cd C:\TMPPACKDIR\%%~nI\
    
            FOR /f "delims=" %%P IN ('dir *.JPG, *.PNG, *.BMP') DO (
                SET %%N = %%P
                SET %%N = 00%%N
                SET %%N = %%N:~-2%
                echo %%P
                echo %%N
                pause
                rename 'C:\TMPPACKDIR\%%~nI\%%P' %%N
            )
    
            pause
    
            echo %%F
    
            cd %%F
    
            ECHO Repacking
            "C:\Program Files\7-Zip\7z.exe" a -t7z "%%~nI.7z" "C:\TMPPACKDIR\%%~nI*" -mx=9 | FIND /V "ing  "
    
            IF %ERRORLEVEL% EQU 0 RD /S /Q C:\TMPPACKDIR
    
            ECHO Renaming new file
            RENAME *.7z *.CB7
    
            ECHO Removing original file
            DEL "%%I"
            ECHO File %%I is done
        )
    )
    
    
    REM del /f/q "%~0" | exit
    

2 个答案:

答案 0 :(得分:1)

是的,问题出在CharSequencecd C:\TMPPACKDIR\%%~nI\之间的代码部分。您正在尝试设置pause变量引用for,但这不起作用。您需要使用普通的环境变量,例如%%N;您只能使用常规环境变量进行子字符串扩展(如代码中的NAME)。此外,由于您在一个代码块中设置和读取相同的环境变量,因此您需要使用delayed expansion;否则,您将始终收到读取整个块时的值。

代码部分应如下所示:

~-2

答案 1 :(得分:0)

我删除了一些不必要的东西并进行了一些更改,(主要错误是aschipfl已经确定的)

FOR /F "DELIMS=" %%F IN ('DIR/AD/S/B') DO (
    PUSHD "%%F"
    IF EXIST *.cbr REN *.cbr *.rar
    IF EXIST *.cbz REN *.cbz *.zip
    IF EXIST *.cb7 REN *.cb7 *.7z
    FOR %%I IN (*.RAR, *.ZIP *.7Z) DO (
        ECHO Extracting %%I...
        "%ProgramFiles%\7-Zip\7z.exe" e "%%I" -o"C:\TMPPACKDIR\*" -y
        PUSHD "C:\TMPPACKDIR\%%~nI"
        FOR %%P IN (*.JPG, *.PNG, *.BMP) DO (
            SET "_N=100%%~nP"
            SETLOCAL ENABLEDELAYEDEXPANSION
            SET "_N=!_N:~-2!"
            REN "%%P" "!_N!%%~xP"
            ENDLOCAL
        )
        POPD
        ECHO Repacking
        "%ProgramFiles%\7-Zip\7z.exe" a -t7z "%%~nI.7z" "C:\TMPPACKDIR\%%~nI*" -mx=9
        IF NOT ERRORLEVEL 1 RD/S/Q "C:\TMPPACKDIR\%%~nI"
        ECHO Renaming new file
        REN "%%~nI.7z" "%%~nI.CB7"
        ECHO Removing original file
        DEL "%%I"
        ECHO File %%I is done
    )
    POPD
)

要研究的事项:
7z.exe不能只提取.cbr,.cbz& .cb7直接没有先重命名。同样,在您提供文件类型后重新打包时,-t7z可以直接为文件指定名称"%%~nI.CB7",而不是稍后重命名。