使用*和批处理文件来获取文件名

时间:2012-09-25 20:56:28

标签: batch-file window

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

如何让所有文件一次一个地读入文件名?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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如何在第二个脚本中工作的说明,请参阅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解决方案适用于恒定长度。该解决方案可以改进一点。

  • 不需要子串操作的第二个参数。无论原始名称有多长,删除它都可以使解决方案正常工作。
  • 如果名称中包含@echo off setlocal disableDelayedExpansion for %%i in (tok.*) do ( set "filename=%%i" setlocal enableDelayedExpansion ren "!filename!" "!filename:~4!.tok" endlocal ) ,代码将失败。通过打开和关闭延迟扩展来修复。
  • 如果是空格或特殊字符,则应在REN语句中引用文件名

{{1}}

答案 2 :(得分:0)

你也可以做同样没有延迟扩展(这很慢)。 此外,如果只有一个点,则不明确使用名称部分的长度。 %~n扩展为没有扩展名的文件名,%〜x扩展为带扩展名的点(所以我用:~1删除了点。)

此外,在for中使用%*,您可以传递任意数量的参数。

甚至更多。如果您添加/ R bewteen for和%% I(您将获得for /R %%I),它也将递归到子目录中。

整批文件:

for %%I IN (%*) do call :Rename "%~I"
exit /b

:Rename
    set newname=%~x1
    ren %1 "%~dp1%newname:~1%.%~n1"
exit /b