【问题标题】:Swap tokens of a file name using batch file使用批处理文件交换文件名的标记
【发布时间】:2017-02-14 06:49:41
【问题描述】:

我的文件夹中有文件,名称如“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

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

【问题讨论】:

  • 谢谢大家的及时回复。我可以满足要求。
  • 不客气。请accept the answer您最喜欢/最能帮助您。

标签: windows batch-file for-loop cmd


【解决方案1】:

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

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"
)

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

【讨论】:

  • 感谢您的详细解释!
【解决方案2】:
@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
  )
)

【讨论】:

    【解决方案3】:

    只是为了展示另一种方式:

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

    如果输出正常,请移除回显

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 2019-05-25
      • 2016-06-19
      • 2013-06-25
      • 1970-01-01
      • 2014-02-22
      • 2013-06-07
      • 1970-01-01
      相关资源
      最近更新 更多