我有以下batch file,通过将文件内容中的下划线和字符附加到文件名称来重命名文本文件。
内容是从位置56的文件的第一行开始的5个字符。
我可以得到这个在我的例子中的单个文件(1.spl),但我不能解决如何得到这个文件夹中的所有* .spl文件运行。
@ECHO OFF SETLOCAL EnableDelayedExpansion for /F "delims=" %%i in (1.spl) do ( set Z=%%i goto BREAK1 ) :BREAK1 SET Z=%Z:~56,5% RENAME 1.spl 1_%Z%.spl
你可以使用另一个FOR循环来调用每个* .spl文件的子程序来重命名文件。
@echo off setlocal EnableExtensions DisableDelayedExpansion for /F "delims=" %%# in ('dir *.spl /AD /B 2^>nul') do call :RenameFile "%%#" endlocal goto :EOF :RenameFile for /F "usebackq delims=" %%I in (%1) do set "FirstLine=%%I" & goto GetNamePart :GetNamePart set "NamePart=%FirstLine:~56,5%" if not exist "%~n1_%NamePart%%~x1" ren %1 "%~n1_%NamePart%%~x1" goto :EOF
主代码中的FOR循环 – 第三行 – 在开始重命名操作之前,使用命令DIR获取* .spl文件的列表。 这里不建议使用for %%# in (*.spl) do ...
因为当前目录中的文件被重命名,这意味着当FOR循环运行时目录条目发生了变化。 强烈建议首先使用DIR获取* .spl文件的完整列表, 然后独立处理目录中的文件重命名。
主FOR调用子例程RenameFile
处理列表中的每个文件。
如果已经存在具有相同名称的现有文件,则文件不会重命名。 这是不太可能的,但应该首先检查。
请注意,如果批处理文件在目录上执行多次,那么批处理代码不会阻止将下划线和第一行的五个字符多次附加到文件名。 额外的IF条件将需要避免多个文件的重命名。
为了理解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
echo /?
endlocal /?
for /?
goto /?
if /?
ren /?
set /?
setlocal /?
运算符&
在子程序中使用FOR循环可以在单个命令行上运行多个命令,有关详细信息,请参阅使用Windows批处理文件的多行命令的单行。