【问题标题】:Is it possible to check if a two files shares the same name using batch file?是否可以使用批处理文件检查两个文件是否共享相同的名称?
【发布时间】:2021-08-11 05:43:55
【问题描述】:

我这里有一个示例目录,其中包含同名但扩展名不同的文件。

MAINFOLDER  
    TEST.JPG
    TEST.PNG
  RANDOM.ZIP
  RANDOM.MP4
 UNKNOWN.MP3
 UNKNOWN.DOC

是否可以自动识别两个文件是否同名?例如; TEST.jpgTEST.png 名称相同,但扩展名不同。我需要批处理文件来识别这些场景

我还想自动将另一个文件从 random.jpg 重命名为 random1.jpg。我现在没有尝试任何批处理代码,因为我害怕弄乱我的目录。

【问题讨论】:

    标签: list file batch-file cmd directory


    【解决方案1】:

    不错的挑战。

    @echo off
    setlocal enabledelayedexpansion
    attrib -a *
    for %%a in (*) do (
      for /f "delims=" %%b in ('dir /b /a-d-a "%%~na.*" 2^>nul^|find /c /v ""') do set count=%%b
      if !count! gtr 1 (
        echo There are !count! files named %%~na.*:
        dir /b /a-d-a "%%~na.*"
        attrib +a "%%~na.*"
      )
    )
    attrib +a *
    

    注意 1:这对包含感叹号的文件名有问题。
    注意 2:这使用 'archive' 属性来避免双胞胎(这应该不是问题,因为这个属性很少使用(至少在家庭环境中),但你应该注意这一点)

    工作原理(简化):

    • 从所有文件中删除存档属性
    • 为每个文件做
    • 列出所有具有该基本名称 (%%~na.*) 的文件并计数
    • 如果计数大于 1,列出这些文件并...
    • ...设置存档属性以避免再次处理这些文件
    • 为所有文件设置存档属性(未为“count=1”的文件设置)

    【讨论】:

    • 感谢您的回答,它非常有用,我只是好奇您是如何在批处理编程中变得流利和擅长的。您能否推荐一些我可以阅读/观看的资源,以了解有关批处理文件的更多信息。
    • 嗯,使用它超过三年肯定有帮助。我认为最重要的两件事是 a) 分析问题并将其分解为更小的子问题 b) 了解范围内的语言能够做什么。观看并没有多大帮助(ymmv),自己做当然可以。尝试在此处为自己回答一些问题,然后然后将您的解决方案与已有的答案进行比较。分析是什么让他们比你的更好(或更差)。我仍然在这里学到很多东西。如果您的更好,请不要犹豫添加答案。评论将帮助您改进它
    • 但请记住,批处理是一个非常古老的东西,可以追溯到没有人能够想象图形界面的时代。如果您认真学习编程,请考虑选择更现代的语言(PowerShell 是官方的继任者/替代品)
    • 感谢您的回复,非常感谢,我一定会尝试您的建议。
    【解决方案2】:

    这是不更改文件属性的替代方法。包含REMarks 是为了解释发生了什么。

    它没有解决您问题的重命名方面,因为我还没有动脑筋。我想是否需要对它进行批处理取决于您要处理的重复文件的数量。

    @ECHO OFF
    SETLOCAL ENABLEDELAYEDEXPANSION
    REM Loop over (DIR)ectory list of (/B)are format files (/A-D)
    FOR /F "tokens=*" %%A IN ('DIR /A-D /B') DO (
      REM Have we already made a check for this file?
      IF NOT [!NEW!]==[!OLD!] (
        REM Again, use DIR, this time to list the instances of the named file and pipe to FIND for (/C)ounting
        REM Then set the variable COUNT with the count value returned by FIND
        REM %%~nA is a variable modifier that returns the filename without extension. The ~ strips surrounding quotes
        FOR /F "tokens=*" %%B IN ('DIR /A-D /B "%%~nA.*" ^| FIND /C "%%~nA."') DO SET "COUNT=%%B"
        REM If 2 or more files counted, build an output line
        IF !COUNT! GEQ 2 ( 
            REM Funny SET syntax used to prevent newlines
            ECHO | SET /p=File '%%~nA' counted !COUNT! times [ 
            REM Again, use DIR, this time to print the instances of the named file
            FOR /F "tokens=*" %%C IN ('DIR /A-D /B "%%~nA.*"') DO ECHO | SET /P='%%C' 
            ECHO ]
        )
        SET "OLD=%%~nA"
       )
       SET "NEW=%%~nA"
    )
    

    样本输出:

    File '1 of 2' counted 2 times [ '1 of 2.doc' '1 of 2.rtf' ]
    File '1' counted 2 times [ '1.rtf' '1.txt' ]
    File '2' counted 4 times [ '2.aac' '2.flac' '2.mp3' '2.mp4' ]
    File 'logitech speakers' counted 2 times [ 'logitech speakers.odt' 'logitech speakers.rtf' ]
    File 'paddle - Copy' counted 4 times [ 'paddle - Copy.bmp' 'paddle - Copy.doc' 'paddle - Copy.rtf' 'paddle - Copy.vbs' ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2019-07-18
      • 2013-01-08
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 2012-05-28
      相关资源
      最近更新 更多