批量添加前导零文件名

batch add leading zeroes filename

我有一个脚本可以用于各种用途,包括重命名和重新包装漫画。此脚本的变体也被其他人使用。

不过,我发现重新包装漫画存在局限性;我发现有些漫画的页面没有前导零,这使得页面看起来乱七八糟。所以,我添加了一个应该添加前导零的部分。

该文件执行以下操作:

  1. 遍历当前文件夹的所有子文件夹
  2. 将漫画档案重命名为适当的扩展名(这样我就可以看到它在哪里)
  3. 遍历所有档案,并将它们解压到一个临时文件夹
  4. 遍历临时文件夹中的所有文件,并添加前导零
  5. 将其重新打包为 7zip
  6. 将文件重命名为漫画扩展名

不知何故,它没有正确重命名文件,并且存档的名称显示为存档中的子文件夹。例如: 让我们重新打包 '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-Zipz.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-Zipz.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

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

代码部分应如下所示:

        cd /D "C:\TMPPACKDIR\%%~nI"

        for /F "delims=" %%P in ('dir /B *.JPG, *.PNG, *.BMP') do (
            set "FILE=C:\TMPPACKDIR\%%~nI\%%P"
            set "NAME=00%%~nP"
            setlocal EnableDelayedExpansion
            set "NAME=!NAME:~-2!"
            rename "!FILE!" "!NAME!%%~xP"
            endlocal
        )

        pause

我删除了一些不必要的东西并做了一些更改,(主要错误是 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%-Zipz.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%-Zipz.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",以后再重命名。