在每个文件前面加上[a-z][1-9]来重命名目录中的所有文件[关闭]。

问题描述 投票:0回答:1

我在传输文件的特定设备上遇到了一个问题。这个设备不能对文件进行分类使用,它总是使用 ascending a-z排序。这就产生了一个问题,我需要按照创建日期来 "处理 "文件。

也就是说,我想出了一个主意,让脚本的形式为 .bat 文件,也就是说,我会把这个脚本放到所有文件所在的目录中,然后简单地运行它。

我们的想法是,这个脚本需要遍历所有的文件,唯一的要求是,它需要对文件进行排序 descending 由创建日期开始前。然后在迭代过程中,需要对每个文件进行重命名,以便在前面添加字母和数字。

结果如下。

a1-file-name.dat // created 5 min ago
...
a2-file-name.dat // created 10 min ago
...
a9-file-name.dat // created 15 min ago
b1-file-name.dat // created 20 min ago
...
b6-file-name.dat // created 25 min ago
...
b9-file-name.dat // created 30 min ago

我在Windows脚本方面没有任何经验和诀窍 所以我想请大家帮助我。

有几个事实。

  • 我只能在每个文件名中最多添加6个字符。
  • 我不能增加 0 位数到文件名
windows batch-file batch-rename
1个回答
1
投票

你可以使用类似这样的代码。唯一的问题是,如果源文件夹有超过234个文件,因为那是所有[a-z][1-9]允许26 * 9 = 234的可能性。我的视频.

@echo off
SetLocal EnableDelayedExpansion
set Source=%userprofile%\desktop\Test
set Letters=abcdefghijklmnopqrstuvwxyz
set Numbers=123456789
set /a CountL=0
set /a CountN=0

for /f "Delims=" %%a in ('dir /b /o-d /tc /s /a-d "%Source%"') do (
set /a TCounter+=1
set FileName=%%~nxa
set FullPath=%%~fa
Call :Rename
set /a CountN+=1
if !CountN! EQU 9 set /a CountN=0& set /a CountL+=1
if !TCounter! EQU 234 goto :Exit
)
:Exit
exit
:Rename
ren "!Fullpath!" "!Letters:~%CountL%,1!!Numbers:~%CountN%,1!!FileName!"
goto :EOF

这是[a-z][a-z][1-9][1-9]文件名.ext版本。

@echo off
SetLocal EnableDelayedExpansion
set Source=%userprofile%\desktop\Test
set Letters=abcdefghijklmnopqrstuvwxyz
set Numbers=123456789
set /a CountL=0
set /a CountN=0
set /a CountL2=0
set /a CountN2=0

for /f "Delims=" %%a in ('dir /b /o-d /tc /s /a-d "%Source%"') do (

set FileName=%%~nxa
set FullPath=%%~fa
Call :Rename
set /a CountN2+=1
if !CountN2! EQU 9 set /a CountN2=0& set /a CountN+=1
IF !CountN! EQU 9 set /a CountN=0& set /a CountN2=0& set /a CountL2+=1
IF !CountL2! EQU 26 set /a CountL+=1
)
:Exit
exit
:Rename
ren "!Fullpath!" "!Letters:~%CountL%,1!!Letters:~%CountL2%,1!!Numbers:~%CountN%,1!!Numbers:~%CountN2%,1!!FileName!"
goto :EOF

1
投票

注:我的第一次尝试是完全错误的(见评论)

DIR 结合 FOR 循环进行 不,它不能处理以下字符 !. 在这种情况下,需要一个临时文件。:

@echo off
====SETLOCAL EnableExtensions EnableDelayedExpansion


::Clear env
set "letters="
set "numbers="
set/a"#=#lines=posL=posN=0"
set "source="
set "tempFile=%TEMP%\getFiles.tmp"


::A-Z ASCII 97~122
FOR /L %%A in (97 1 122) do (
    "%ComSpec%"/c exit %%A
    set "letters=!letters!!=ExitCodeAscii!"
)
::1-9
FOR /L %%# in (1 1 9) do set "numbers=!numbers!%%#"


::Count #FILES
(dir /A-D /B /T:C /O-D) 1>"%tempFile%" 2>nul
set "getLines="%__APPDIR__%findstr.exe" /N "^^" "%tempFile%""
FOR /F %%L in ('"!getLines!"') do set/a"#lines+=1"


::Read from STDIN
pushd "%source%" || exit /b
setlocal DisableDelayedExpansion EnableExtensions
<"%tempFile%" (FOR /L %%L in (1 1 %#lines%) do (
    set "file="
    set/p"file="
    set/a^"#+=1,^%=Increase order by 1=%
    posL=(#/10^) %% 26,^%=Get position of # in LETTERS modulo 26=%
    posN=(# %% 9^)-1"%=From 1~9=%
    setlocal EnableDelayedExpansion
    FOR /F "tokens=1-2 delims= " %%A in ("!posL! !posN!") do (
        echo(REN "!file!" "!letters:~%%A,1!!numbers:~%%B,1!-!file!"
    ) %=Delete ECHO( to run for true=%
    endlocal
))


popd
endlocal
====ENDLOCAL


::Anything here...

FOR /L %%A in (97 1 122) 循环 %%A (ASCII码)从97到122。只读的 动态变量 =ExitCodeAscii 被讨论 此处. 这不是必须的,但在复杂的情况下,它更灵活。

dir /a-d /b /o-d 让我再试一下。

dir /A-D /B /T:C /O-D 搜索当前目录中的文件,不包括目录和基于创建日期的排序。

我使用了一个额外的 FOR 循环,因为我想用一个变量替换另一个变量,这两个变量都需要延迟扩展。

© www.soinside.com 2019 - 2024. All rights reserved.