获取Windows批处理文件以基于具有通配符匹配的内容重命名文本文件

时间:2017-08-17 04:08:54

标签: windows 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

1 个答案:

答案 0 :(得分:0)

你可以使用另一个 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 循环正在运行时,目录条目会更改。强烈建议首先使用 DIR 然后处理完整的* .spl文件列表,独立处理此列表中的文件重命名目录。

FOR 调用子程序RenameFile来处理列表中的每个文件。

如果已存在具有相同名称的现有文件,则不会重命名文件。这是不太可能的,但应首先检查。

请注意,如果批处理文件在目录上多次执行,则批处理代码不会阻止将下划线和第一行的五个字符多次附加到文件名。需要额外的 IF 条件才能避免多次重命名文件。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • ren /?
  • set /?
  • setlocal /?

在子程序中 FOR 循环上使用的运算符&可以在单个命令行上运行多个命令,有关详细信息,请参阅Single line with multiple commands using Windows batch file