你可以使用另一个FOR循环这就要求每一个* .spl文件子程序重命名文件。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "delims=" %%# in ('dir *.spl /A-D /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循环正在运行。强烈建议首先获得 * .spl文件的完整列表,使用DIR和然后独立处理目录中的文件重命名。
主对于调用子程序RenameFile
来处理列表中的每个文件。
如果已存在具有相同名称的现有文件,则不会重命名文件。这是不太可能的,但应该首先检查。
请注意,如果批处理文件在目录上执行多次,批处理代码不会阻止将多个第一行的下划线和五个字符附加到文件名。需要额外的IF条件以避免多次重命名文件。
为了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
echo /?
endlocal /?
for /?
goto /?
if /?
ren /?
set /?
setlocal /?
作为在子程序环上使用的操作者&
使得有可能在单个命令行上运行多个命令,请参见Single line with multiple commands using Windows batch file的详细信息。
使用'%%〜I'而不是'%% I'会更安全吗? – SteveFest
@SteveFest一般来说是的,但在这种情况下,我怀疑文件的第一行是用双引号引起来的。即使第一行用双引号引起来,使用'%%〜I'会从行中删除第一个和最后一个字符,这可能会导致从列57中的5个字符错误提取(第一列的列编号为1)为一行中的一个字符在之前已被删除。提问者没有发布文件通常包含的内容作为第一行。所以我们只能假设发布的代码适用于* .spl文件中的数据。 – Mofi