使用批处理文件交换文件名的标记

时间:2017-02-14 06:49:41

标签: windows batch-file for-loop cmd

我的文件夹名称为“223.DAT_2017010211315”。我想遍历所有文件,并将它们重命名为223_2017010211315.DAT“

我最接近这个要求如下。我可以得到文件名的第一个标记。

set "res=223.DAT_2017010211315"
for /f "tokens=1 delims=." %%i in ("%res%") do (set prefix=%%i)
echo %prefix%
pause

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

让我们从迭代文件系统开始。这应该搜索所需的文件并显示它们

for %%f in ("*.dat_*") do echo %%f

现在,一旦我们能够找到要处理的文件,我们需要分离文件的名称和扩展名。这是一项简单的任务,因为for可替换参数(前面代码中的%%f)允许使用一些修饰符来检索引用文件的特定信息(有关完整列表,请参阅for /?) 。我们将使用%%~nf%%f引用的文件的名称)和%%~xf%%f引用的文件的扩展名)

for %%f in ("*.dat_*") do echo %%~nf   %%~xf

一旦我们有了这两个元素,我们需要使用下划线作为分隔符来拆分扩展。这将给我们两个标记,下划线的左侧和右侧。为此,for /f用于处理文件扩展名。

for /f "tokens=1,2 delims=_" %%a in ("%%~xf") do echo %%a %%b

当我们请求两个令牌时,for /f将使用请求的可替换参数%%a来存储第一个令牌,并将创建一个额外的可替换参数%%b(下一个字符)到存储第二个令牌。

%%~nf %%~xf
  [.][................]
  223.DAT_2017010211315  = %%f
     ^..^ ^...........^
     %%a  %%b 

因此,对于列表中的每个文件,执行for /f以检索执行ren命令所需的信息。

for %%f in ("*.dat_*") do for /f "tokens=1,2 delims=_" %%a in ("%%~xf") do (
    echo ren "%%f" "%%~nf_%%b%%a"
)

请注意,对于调试purpouses,ren命令不会执行,只会回显到控制台以检查代码行为。如果输出正确,请删除echo并再次运行代码。

答案 1 :(得分:1)

@echo off
REM for every file matching the filter do:
for %%f in (*.dat_*) do (
  REM disassemble into tree tokens, using . and _ as delimiters:
  for /f "tokens=1,2,3 delims=._" %%a in ("%%~f") do (
    REM re-assemble in different order:
    echo %%a_%%c.%%b
  )
)

答案 2 :(得分:0)

只是为了表明另一种方式:

@echo off&setlocal enabledelayedexpansion
pushd "X:\path\to\folder"
for %%A in (*.dat_*) do (
  set fname=%%A
  Echo ren "%%A" "!fname:.DAT=!.DAT"
) 
Popd

如果输出看起来没问题,请删除回声