微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于文件重命名批处理脚本的enabledelayedexpansion问题

我正在写批处理脚本单调文件更名。 基本上,它使所有文件标题1 2 3 4 ….等等。 我已经扩大它能够处理不同types的文件(TXT,DOC,FLV等),但并不是所有的东西都在工作。

我主要关心的是我已经打破了我之前做的延期扩张呼叫。 现在使用!var1! 永远不会扩大,或永远不会被认为是一个variables。

这里是我的脚本的详细评论版本

::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到多less个文件

仅列出子目录而不是完整的目录

xcopy – 复制至less一个匹配模式的文件

sc.execonfiguration“服务名称”obj =“DOMAIN 用户密码=“密码”不起作用

在令牌分隔符batch file中使用百分比符号

Plink通过Windowsbatch file处理特定的错误

当我运行代码时,它永远不会使用标记为适当延迟扩展的variables,始终将它们留作“!varname!”,所以它会重命名一个文件“!counter!。!type!”。 并为其余部分抛出错误,因为该目录中已经有一个文件

这带来了第二个问题。 按字母顺序对目录列表进行sorting会导致编号文件的处理不佳。 例如列表:“1 7 15 75 120”被sorting:“1 120 15 7 75”我还没有find解决办法,只是它确实是dirsorting的预期结果。 我唯一的解决方法是填充数字在前面有足够的零。

提前感谢任何见解!

一切都sorting,但第二个问题。 我想我说得不好。 我有这个问题,当我在目录文件名,而不是写出时。 所以他们已经需要填充。 我希望有一些其他的方式来读取目录,并对其进行适当的sorting。

我发现的最有希望的事情是在这里: 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 /an=%~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 )

代码可以sorting文件名中的一个数字(即video100.mov是好的,video100video10.mov会打破它)

我所遇到的问题是我认为给这个帮手添加一个调用会再次打破它,所以我会试图把这个包含在我修改后的renamer.bat中。 任何帮助表示赞赏。

如果大于batch file

如何在batch file执行后在Python中closures命令提示符窗口?

Windows格式命令行跳过“input当前音量…”和“继续格式…”

将文本文件内容读入环境variables

使用forfiles将输出redirect到文件

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

但是,你不需要它。 您可以使用~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

我没有遇到任何延迟扩展的问题,对我来说一切正常(当然,除非我没有exttostr.bat助手脚本)。

无论如何,有几件事情可以改善你的脚本:

您不需要将DIR的结果存储到文件中以便DIR读取。 您可以直接在FOR循环中读取输出

您不需要帮助器批处理脚本。 通过使用~x修饰符和循环变量: %% ~x a %%a ,可以从%%a提取扩展名。 您可以通过从命令提示符发出HELP FOR来阅读关于修饰符的更多信息。

重命名批处理文件自己的名称可以在脚本中被引用为%0 。 你可以应用~n修饰符,你只需要使用没有扩展名的名字。 ~nx的组合修饰符会给你带扩展名的名字。

所以,以下是解决上述问题的脚本:

::a monotonic file renamer @echo off SETLOCAL ENABLEDELAYEDEXPANSION IF [%1] == [] GOTO usage ::initialize SET /A counter=0 SET type= SET /A ender=%1 ::read lines one by one FOR /F "usebackq delims=" %%a IN (`DIR /B /ON`) DO ( REM make sure we do not rename any of the working files IF NOT "%%~a"=="%~nx0" ( SET /A counter+=1 RENAME "%%~a" "!counter!%%~xa" ECHO Renamed "%%~a" to "!counter!%%~xa" ) REM exit when we have run enough IF "!counter!"=="!ender!" GOTO :EOF ) GOTO :EOF :usage ECHO Usage: %~n0 NUMFILES

至于你的第二个问题,可以很容易解决这样的问题:

用100000作为counter的初始值。 (尽管使用了许多0,但可能不会超过9个。)添加相同的值以便使用。

重命名文件,而不是!counter! 使用删除一个字符( 1 )的表达式: !counter:~1! (事实上​​,这不是关于删除,而是关于从1的偏移量开始提取子字符串,用HELP SET命令来了解更多信息)。

以下是上述脚本的修改版本:

::a monotonic file renamer @echo off SETLOCAL ENABLEDELAYEDEXPANSION IF [%1] == [] GOTO usage ::initialize SET /A counter= 1000 SET type= SET /A ender=%1 SET /A ender+=counter ::read lines one by one FOR /F "usebackq delims=" %%a IN (`DIR /B /ON`) DO ( REM make sure we do not rename any of the working files IF NOT "%%~a"=="%~nx0" ( SET /A counter+=1 RENAME "%%~a" " !counter:~1! %%~xa" ECHO Renamed "%%~a" to " !counter:~1! %%~xa" ) REM exit when we have run enough IF "!counter!"=="!ender!" GOTO :EOF ) GOTO :EOF :usage ECHO Usage: renamer NUMFILES

你也可以看到我做了一些其他的改进,比如确保文件名用双引号括起来,并使用GOTO :EOF代替GOTO exit ( :EOF是一个特殊的预定义标签,指向批处理结束脚本,所以你不需要自己定义)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐