不需要批处理脚本
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 在第二个脚本中如何工作的说明,请参阅 How does the Windows RENAME command interpret wildcards?
我想可以提出一个深奥的论点,即像 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 解决方案适用于恒定长度。该解决方案可以改进一点。
- 不需要子字符串操作的第二个参数。无论原始名称有多长,删除它都可以让解决方案正常工作。
- 如果名称中包含
!,则代码将失败。通过打开和关闭延迟扩展来修复。
- 文件名应在 REN 语句中引用,以防出现空格或特殊字符
.
@echo off
setlocal disableDelayedExpansion
for %%i in (tok.*) do (
set "filename=%%i"
setlocal enableDelayedExpansion
ren "!filename!" "!filename:~4!.tok"
endlocal
)