【问题标题】:use * with a batch file to get filenames将 * 与批处理文件一起使用以获取文件名
【发布时间】:2012-09-17 10:35:51
【问题描述】:

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

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

【问题讨论】:

    标签: batch-file window


    【解决方案1】:

    使用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,很好,但可以改进。见my answer
    • @dbenham - 确实可以在解决方案中考虑许多其他变量(如您的回答中所述),但 OP 表示他们现有的批处理文件已经根据需要工作,除非他们必须手动键入每个文件名,这意味着所有其他注意事项都不是问题。
    • 谢谢,这非常适合我需要做的事情。我只是添加了一点,所以它会更改为每个目录,然后将所有文件名从 unix filepro 格式更改为 windows filepro 格式。
    【解决方案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 解决方案适用于恒定长度。该解决方案可以改进一点。

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

    .

    @echo off
    setlocal disableDelayedExpansion
    for %%i in (tok.*) do (
      set "filename=%%i"
      setlocal enableDelayedExpansion
      ren "!filename!" "!filename:~4!.tok"
      endlocal
    )
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-19
        • 1970-01-01
        • 2014-02-26
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-25
        相关资源
        最近更新 更多