是否可以使用批处理文件检查两个文件是否共享相同的名称?

Posted

技术标签:

【中文标题】是否可以使用批处理文件检查两个文件是否共享相同的名称?【英文标题】: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。我现在没有尝试任何批处理代码,因为我害怕弄乱我的目录。

【问题讨论】:

【参考方案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' ]

【讨论】:

以上是关于是否可以使用批处理文件检查两个文件是否共享相同的名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何比较二进制文件以检查它们是不是相同?

在线程之间共享一个类

是否可以检查两个现有的 GL 上下文是否共享资源?

win10局域网多台电脑共享无法互相访问

win7无法将linux的共享文件夹映射网络驱动器

局域网内计算机共享文件夹后,另一台无法访问