我使用的是 Windows XP,需要创建一个批处理文件来将 tok.filename 移动到 filename.tok。如果我输入,这适用于一个文件fix.bat tok.filename
。
set filename=%1
set newname=%filename:~4,45%
ren %1 %newname%.tok
我需要输入fix.bat tok*
,但这会tok*
输入文件名。
如何让它一次将所有文件读入文件名?
我使用的是 Windows XP,需要创建一个批处理文件来将 tok.filename 移动到 filename.tok。如果我输入,这适用于一个文件fix.bat tok.filename
。
set filename=%1
set newname=%filename:~4,45%
ren %1 %newname%.tok
我需要输入fix.bat tok*
,但这会tok*
输入文件名。
如何让它一次将所有文件读入文件名?
使用for
声明。
setlocal enabledelayedexpansion
for %%i in (tok.*) do (
set filename=%%i
set newname=!filename:~4,45!
ren %%i !newname!.tok
)
启用延迟扩展可以使变量在使用时进行评估。
或者,由于您已经有一个可以工作的批处理文件,您可以编写另一个使用该for
语句的批处理文件,该语句调用您的工作批处理文件——如下所示:
for %%i in (tok.*) do call fix.bat %%i
或者你可以像这样直接从命令行运行它:
for %i in (tok.*) do call fix.bat %i
不需要批处理脚本
for %F in (tok.*) do for /f "delims=." %X in ("%~xF") do ren "%F" "%X.%~nF"
如果在批处理脚本中使用,则将百分比加倍。
.
如果文件名中出现多个,则上述内容可能无法提供所需的结果。
例如tok.part1.part2
会变成part2.tok.part1
.
如果您愿意part1.part2.tok
,可以使用以下简单脚本。
@echo off
ren tok.* .*?.tok
for %%F in (.*.tok) do for /f "tokens=* delims=." %%A in ("%%F") do ren "%%F" "%%A"
有关第一个 REN 如何在第二个脚本中工作的说明,请参阅Windows RENAME 命令如何解释通配符?
我想可以提出一个深奥的论点,即当它应该tok..name
成为一个名字时。这可以通过使用来解决:name.tok
.name.tok
@echo off
setlocal disableDelayedExpansion
ren tok.* .*?.tok
for %%F in (.*.tok) do (
set "name=%%F"
setlocal enableDelayedExpansion
ren "!name!" "!name:~1!"
endlocal
)
上述解决方案的好处是它们不依赖于“tok”的长度。任何长度的字符串值都可以代替“tok”,并且代码也可以正常工作。
James L 解决方案适用于恒定长度。该解决方案可以改进一点。
!
。通过打开和关闭延迟扩展来修复。.
@echo off
setlocal disableDelayedExpansion
for %%i in (tok.*) do (
set "filename=%%i"
setlocal enableDelayedExpansion
ren "!filename!" "!filename:~4!.tok"
endlocal
)
您也可以在不延迟扩展的情况下执行相同操作(这很慢)。此外,如果只有一个点,则无需明确使用名称部分的长度。%~n 扩展为不带扩展名的文件名, %~x 扩展为带扩展名的点(所以我删除了带扩展名的点:~1
)。
此外,在 for 中使用 %*,您可以传递任意数量的参数。
甚至更多。如果在 %%I 和 %%I 之间添加 /R (你会得到for /R %%I
),它也会递归到子目录中。
整个批处理文件:
for %%I IN (%*) do call :Rename "%~I"
exit /b
:Rename
set newname=%~x1
ren %1 "%~dp1%newname:~1%.%~n1"
exit /b