gpt4 book ai didi

windows - 文件重命名批处理脚本的 enabledelayedexpansion 问题

转载 作者:可可西里 更新时间:2023-11-01 09:56:30 26 4
gpt4 key购买 nike

我正在编写一个批处理脚本单调文件重命名器。基本上,它使所有文件的标题为 1 2 3 4 .... 等等。此后,我对其进行了扩展,使其能够处理不同类型的文件(txt、doc、flv 等),但并非一切正常。

我主要担心的是我打破了我之前进行的延迟扩展调用。现在使用 !var1!永远不会扩展,或者永远不会被识别为变量。

这是我的脚本的详细注释版本

::a monotonic file renamer
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET tempfile=temp.txt
SET exttemp=exttemp.txt
if [%1] == [] goto usage

::make sure your dont overwrite something useful
if EXIST %tempfile% (
ECHO Temp file already exists, are you sure you want to delete?
del /P %tempfile%
)
if EXIST %exttemp% (
ECHO EXT Temp file already exists, are you sure you want to delete?
del /P %exttemp%
)

::initialize
SET /a counter=0
SET type=
SET /a ender=%1

::write filenames to tempfile
DIR /B /ON > %tempfile%

::read lines one by one
for /f "usebackq delims=" %%a in (%tempfile%) do (
REM make sure we do not rename any of the working files
if NOT "%%a"=="renamer.bat" (
if NOT "%%a"=="temp.txt" (
if NOT "%%a"=="exttostr.bat" (
SET /a counter+=1
REM get file extension
exttostr %%a > %exttemp%
SET /P type= < %exttemp%
REM housekeeping
del /F %exttemp%
REM rename
ren %%a !counter!.!type!
ECHO Renamed "%%a" to "!counter!.!type!"
)))
REM exit when we have run enough
if "!counter!"=="!ender!" goto exit
)

goto exit

:usage
echo Usage: renamer NUMFILES

:exit
::final housekeeping
DEL temp.txt

我的想法是将我的两个文件 renamer.bat(此文件)和 exttostr.bat(获取文件扩展名的助手)放入文件夹并运行它,它将按字母顺序从 1 重命名文件到多少我指定的文件。

当我运行代码时,它从不适本地使用标记为延迟扩展的变量,总是将它们保留为“!varname!”,因此它将第一个文件重命名为“!counter!.!type!”并为其余部分抛出错误,因为目录中已存在同名文件。

这让我想到了一个次要问题。按字母顺序对目录列表进行排序会导致对编号文件的处理不佳。例如列表:“1 7 15 75 120”已排序:“1 120 15 7 75”我还没有找到解决这个问题的方法,只是它确实是 dir 排序的预期结果。我唯一的解决方法是在前面用足够的零填充数字。

提前感谢您的任何见解!


除第二个问题外,一切都已排序。我想我没有讲好。当我输入目录文件名时,而不是写出时,我遇到了这个问题。所以他们已经需要填充了。我希望有其他方法可以读取目录并对其进行适当排序。

我发现的最有前途的东西在这里:http://www.dostips.com/DtCodeBatchFiles.php#Batch.SortTextWithNumbers

    @ECHO OFF
if "%~1"=="/?" (
echo.Sorts text by handling first number in line as number not text
echo.
echo.%~n0 [n]
echo.
echo. n Specifies the character number, n, to
echo. begin each comparison. 3 indicates that
echo. each comparison should begin at the 3rd
echo. character in each line. Lines with fewer
echo. than n characters collate before other lines.
echo. By default comparisons start at the first
echo. character in each line.
echo.
echo.Description:
echo. 'abc10def3' is bigger than 'abc9def4' because
echo. first number in first string is 10
echo. first number in second string is 9
echo. whereas normal text compare returns
echo. 'abc10def3' smaller than 'abc9def4'
echo.
echo.Example:
echo. To sort a directory pipe the output of the dir
echo. command into %~n0 like this:
echo. dir /b^|%~n0
echo.
echo.Source: http://www.dostips.com
goto:EOF
)

if "%~1" NEQ "~" (
for /f "tokens=1,* delims=," %%a in ('"%~f0 ~ %*|sort"') do echo.%%b
goto:EOF
)
SETLOCAL ENABLEDELAYEDEXPANSION
set /a n=%~2+0
for /f "tokens=1,* delims=]" %%A in ('"find /n /v """') do (
set f=,%%B
(
set f0=!f:~0,%n%!
set f0=!f0:~1!
rem call call set f=,%%%%f:*%%f0%%=%%%%
set f=,!f:~%n%!
)
for /f "delims=1234567890" %%b in ("!f!") do (
set f1=%%b
set f1=!f1:~1!
call set f=0%%f:*%%b=%%
)
for /f "delims=abcdefghijklmnopqrstuwwxyzABCDEFGHIJKLMNOPQRSTUWWXYZ~`@#$*_-+=:;',.?/\ " %%b in ("!f!") do (
set f2=00000000000000000000%%b
set f2=!f2:~-20!
call set f=%%f:*%%b=%%
)
echo.!f1!!f2!!f!,%%B
rem echo.-!f0!*!f1!*!f2!*!f!*%%a>&2
)

这段代码可以用一个数字对文件名进行排序(即 video100.mov 没问题,video100video10.mov 会破坏它)

我遇到的问题是,我认为添加对此助手 fn 的调用会再次破坏它,所以我现在将尝试将其包含在我修改后的 renamer.bat 中。任何帮助表示赞赏。

最佳答案

可能是提取扩展的批处理重置了本地环境。

但是,您不需要它。您可以使用 ~x 选项提取扩展名。类似于此....

:monotonicrename
set /a counter = 0
for %%a in (%1\*.*) do (
if exist %%~fa (
set /a counter += 1
echo ren %%~fa !counter!%%~xa
)
)
goto :eof

要在计数器中包含前导零,以便目录正确排序,请将之前的重命名命令替换为三行

set zcounter=0000!counter!
set zcounter=!zcounter:~-4!
echo ren %%~fa !counter!%%~xa

所以将所有部分放在一起,在批处理文件中添加您刚刚创建的 monotonicrename 函数,它可以像...一样简单

@echo off
setlocal enabledelayedexpansion
call :monotonicrename %1
goto :eof
:monotonicrename
set /a counter = 0
for %%a in (%1\*.*) do (
if exist %%~fa (
set /a counter += 1
set zcounter=0000!counter!
set zcounter=!zcounter:~-4!
echo ren %%~fa !zcounter!%%~xa
)
)
goto :eof

关于windows - 文件重命名批处理脚本的 enabledelayedexpansion 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6515453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com