我使用的是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*
放入文件名中。
如何让所有文件一次一个地读入文件名?
答案 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
)
,代码将失败。通过打开和关闭延迟扩展来修复。
{{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