1

我使用的是 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*输入文件名。

如何让它一次将所有文件读入文件名?

4

3 回答 3

3

使用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
于 2012-09-25T21:08:57.543 回答
2

不需要批处理脚本

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 解决方案适用于恒定长度。该解决方案可以改进一点。

  • 不需要子字符串操作的第二个参数。无论完整的原始名称有多长,删除它都可以让解决方案工作。
  • 如果名称中有一个,代码将失败!。通过打开和关闭延迟扩展来修复。
  • 文件名应在 REN 语句中引用,以防出现空格或特殊字符

.

@echo off
setlocal disableDelayedExpansion
for %%i in (tok.*) do (
  set "filename=%%i"
  setlocal enableDelayedExpansion
  ren "!filename!" "!filename:~4!.tok"
  endlocal
)
于 2012-09-26T02:15:02.463 回答
0

您也可以在不延迟扩展的情况下执行相同操作(这很慢)。此外,如果只有一个点,则无需明确使用名称部分的长度。%~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
于 2013-12-20T11:38:06.097 回答