【问题标题】:Windows scripting FOR command to rename all files in a directoryWindows 脚本 FOR 命令重命名目录中的所有文件
【发布时间】:2008-10-10 13:47:54
【问题描述】:

我正在尝试在命令提示符下使用 FOR 命令重命名 Windows 目录中存在的所有文件,如下所示:

for %1 in (*.*) do ren %1 test%1 

例如这会将文件 enc1.ctl 重命名为 testenc1.ctl enc2.ctltestenc2.ctl

那不是我想要的。我想要的是 enc1.ctl 重命名为 test1.ctl enc2.ctl 重命名为 test2.ctl

我该怎么做?


@阿克卢努克: 谢谢,这很有效,但我的文件名是

h263_enc_random_pixels_1.ctl , h263_enc_random_pixels_2.ctl 我想重命名为

test1.ctl 和 test2.ctl 分别

那怎么办?

【问题讨论】:

    标签: windows cmd


    【解决方案1】:

    我明白了!

    for %1 in (.) do ren %1 t%1
    

    然后:

    ren tenc*.* test*.*
    

    【讨论】:

      【解决方案2】:

      如果你知道文件的数量,(比如 10 个),你可以使用

      for /L %1 in (1,1,10) do ren enc%1.ctl test%1.ctl
      

      【讨论】:

        【解决方案3】:

        我不确定是否可以批量处理,但是我又一次没有掌握这种原始语言... :-P

        如果 CMD 不是强制性的,但您不能使用好的文件重命名器,则可以使用 WSH:

        var path= "E:/tmp";
        
        var fso = WScript.CreateObject("Scripting.FileSystemObject");
        var folder = fso.GetFolder(path);
        var files = new Enumerator(folder.files);
        for (; !files.atEnd(); files.moveNext())
        {
          var file = files.item();
          var fileName = file.Name;
          var p = /^enc(\d+)\.ctl$/.exec(fileName);
          if (p != null)
          {
            var newFileName = "test" + p[1] + ".ctl";
            // Optional feedback
            WScript.echo(fileName + " -----> " + newFileName);
            file.Move(newFileName);
          }
        }
        

        当然,把它放在一个 file.js
        我实际上用file.Copy(file.ParentFolder + "/SO/" + newFileName); 进行了测试以避免丢失文件...

        HTH。

        【讨论】:

          【解决方案4】:

          这将重命名目录中的所有文件,以过滤文件类型,前缀和今天的日期和时间

          @echo ON
          cls
          for %%a in (*.pdf) do (set myfiledate=%%~ta echo !myfiledate!)
          
          echo Date format = %myfiledate%
          echo dd = %myfiledate:~0,2%
          echo mm = %myfiledate:~3,2%
          echo yyyy = %myfiledate:~6,4%
          echo.
          echo Time format = %myfiledate%
          echo hh = %myfiledate:~11,2%
          echo mm = %myfiledate:~14,2%
          echo AM = %myfiledate:~17,2%
          echo.
          echo Timestamp = %myfiledate:~0,2%_%myfiledate:~3,2%_%myfiledate:~6,4%-%myfiledate:~11,2%_%myfiledate:~14,2%_%myfiledate:~17,2%
          ECHO "TEST..." > "test-%myfiledate:~0,2%_%myfiledate:~3,2%_%myfiledate:~6,4%-TIME-%myfiledate:~11,2%_%myfiledate:~14,2%_%myfiledate:~17,2%.txt"
          PAUSE
          

          这成功地将修改日期和时间作为后缀回显,但不会将信息解析为重命名。我不知道为什么,但它非常接近。也许有人无法根据您的目的进行调整。

          @echo ON
          setlocal
          cls
          for %%a in (*.pdf) do (set myfiledate=%%~ta echo !myfiledate!)
          
          :DATETIME
          echo Date format = %myfiledate%
          echo dd = %myfiledate:~0,2%
          echo mm = %myfiledate:~3,2%
          echo yyyy = %myfiledate:~6,4%
          
          echo Time format = %myfiledate%
          echo hh = %myfiledate:~11,2%
          echo mm = %myfiledate:~14,2%
          echo AM = %myfiledate:~17,2%
           = %myfiledate:~17,2%
          echo.
          
          echo Timestamp = %myfiledate:~0,2%_%myfiledate:~3,2%_%myfiledate:~6,4%-%myfiledate:~11,2%_%myfiledate:~14,2%_%myfiledate:~17,2%
          ECHO "TEST..." > "test-%myfiledate:~0,2%_%myfiledate:~3,2%_%myfiledate:~6,4%-TIME-%myfiledate:~11,2%_%myfiledate:~14,2%_%myfiledate:~17,2%.txt"
          
          for /f "delims=" %%a in ('dir *.pdf /t:a /a:-d /b /s') do call :RENAME "%%a"
          
          :RENAME
          REM for /f "tokens=1-6 delims=/ " %%a in ('dir %%a /t:w^|find "/"') do (
          ren %%a "3DC-test-OFF-ELE-%myfiledate:~0,2%_%myfiledate:~3,2%_%myfiledate:~6,4%-TIME-%myfiledate:~11,2%_%myfiledate:~14,2%_%myfiledate:~17,2%~x1")
          PAUSE
          GOTO :EOF
          

          【讨论】: