AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1855875
Accepted
Sark
Sark
Asked: 2024-09-16 06:12:30 +0800 CST2024-09-16 06:12:30 +0800 CST 2024-09-16 06:12:30 +0800 CST

Windows批处理比较两个部分不匹配的文件名

  • 772

我有一个目录,里面有视频文件及其对应的(隐藏).idx 文件。删除任何视频文件时,相应的 .idx 文件都会保留下来。我想定期删除这些“不相关的”.idx 文件。

下面的批处理脚本实现了这一点,但它仅在 .idx 文件名与视频文件名匹配时才有效。即:One.mts和One.idx。问题是,在创建时, .idx 文件的名称后会附加视频文件扩展名。因此,我有One.mts和One.mts.idx。

我如何让代码比较这两个名称,同时忽略 .idx 文件中附加的扩展名。最好的解决方案是,如果我可以让代码忽略文件的 .idx 部分,同时仍然比较这两个文件。这将使其他视频类型可以存储在同一目录中,而不会删除它们的 .idx 文件,因为它们与 .mts 视频文件名不匹配(我认为)。

仅供参考:.idx 文件被隐藏的事实与以下代码无关。

@echo off
   echo.
   echo.

for %%F in ("*.idx") do @if not exist "%%~nF.mts" echo "%%F"
   echo.
   echo.

set /p my_var= Press ENTER To Delete...Click X to Cancel

   for %%F in (*.idx) do @if not exist "%%~nF.mts" del "%%F"
video
  • 2 2 个回答
  • 162 Views

2 个回答

  • Voted
  1. Best Answer
    Io-oI
    2024-09-17T13:43:13+08:002024-09-17T13:43:13+08:00

    只是为了确保我理解你的问题,即使我对母语以外的语言存在认知障碍......

    假设我有一个包含以下文件的文件夹......

    .\001.mts.idx
    .\002.idx
    .\002.mts
    .\003.mts.idx
    .\004.idx
    .\004.mts
    .\005.mts.idx
    .\006.idx
    .\006.mts
    .\007.mts.idx
    .\008.idx
    .\008.mts
    .\009.mts.idx
    .\010.idx
    .\011.mts.idx
    .\012.idx
    

    为了为我的测试创建这些文件,我在一个空文件夹中创建了它们并运行了以下脚本:

    @echo off
      
    cd /d "%~dp0"
      
    >.\001.mts.idx   echo/001.mts.idx
    >.\002.idx       echo/002.idx
    >.\002.mts       echo/002.mts
    >.\003.mts.idx   echo/003.mts.idx
    >.\004.idx       echo/004.idx
    >.\004.mts       echo/004.mts
    >.\005.mts.idx   echo/005.mts.idx
    >.\006.idx       echo/006.idx
    >.\006.mts       echo/006.mts
    >.\007.mts.idx   echo/007.mts.idx
    >.\008.idx       echo/008.idx
    >.\008.mts       echo/008.mts
    >.\009.mts.idx   echo/009.mts.idx
    >.\010.idx       echo/010.idx
    >.\011.mts.idx   echo/011.mts.idx
    >.\012.idx       echo/012.idx
    

    现在这些文件放在一个文件夹中,由于不确定它们的目的或场景,我尝试使用for /f循环仅过滤文件where any_name.mts.idx,这是因为该where命令可以通过明确回答格式中使用通配符的名称来列出此名称布局中的文件*.mts.idx。

    由于我已经在循环中获取了感兴趣的文件的名称,因此我只需要使用不存在文件条件来执行删除孤立文件的操作,因此如果该文件current_name.mts不存在,那么我明白它是用于删除的current_name.mts.idx......

    @echo off && setlocal
    
    cd /d "%~dp0"
    
    for /f delims^= %%G in =;(' @"%__AppDir__%where.exe" .:*.mts.idx
       ');= do call set "_name=%%~nG" && call %:^) "%%_name:.idx=%%"
    
    %:^)
    if "%~1" == "" =;(
         "%windir%\System32\timeout.exe" -1 | endlocal & goto :eOf
        );= else if not exist ".\%~1" =;(
            echo/Deleting ".\%~1.idx" - file ".\%~n1.mts" not found!..
            @del /q /f /a ".\%~1.idx" & exit /b
        );= 
    
    exit /b 
    
    • 批量输出 // 通过echo/Deleting ".\%~1" ...:
    Deleting ".\001.mts.idx" - file ".\001.mts" not found!..
    Deleting ".\003.mts.idx" - file ".\003.mts" not found!..
    Deleting ".\005.mts.idx" - file ".\005.mts" not found!..
    Deleting ".\007.mts.idx" - file ".\007.mts" not found!..
    Deleting ".\009.mts.idx" - file ".\009.mts" not found!..
    Deleting ".\011.mts.idx" - file ".\011.mts" not found!..
    

    这仅处理删除名称中包含 的不匹配文件的部分AnyName.mts.idx,但如果您专注于接收响应以处理删除any.idx和/或 的孤立名称any.mts.idx。那么,您必须使用两个For /F循环,第二个循环使用特定的过滤器来不处理名称 的出现,这可以通过...*.mts.idx获得。find /aVoid

    @echo off && setlocal
    
    cd /d "%~dp0"
    
    for /f usebackq^delims^= %%G in =;(
        `"%windir%\System32\where.exe" .:*.mts.idx`
        );= do call set "_name=%%~nG" && call %:^) "%%_name:.idx=%%"
    
    %:^)
    if "%~1" == "" goto %:^(
    
    if not exist ".\%~1" =;(
         echo/Deleting ".\%~1.idx" - file "%~1" not found!..
         @del /q /f /a ".\%~1.idx" & exit /b
        );= else goto :eOf
    
    %:^(
    for /f usebackq^delims^= %%i in =;(
        `call "%windir%\System32\where.exe" .:*.idx ^| "%windir%\System32\find.exe" /v /i ".mts.idx"`
        );= do if not exist ".\%%~ni.mts" =;(
              echo/Deleting ".\%%~ni.idx"     - file ".\%%~ni.mts" not found!..
              @del /q /f /a ".\%%~ni.idx"
            );=
    
    "%windir%\System32\timeout.exe" -1 | endlocal & goto :eOf 
    
    • 批量输出 // 通过echo/Deleting ".\%~1.idx" |or| ".\%%~ni.idx" ...:
    Deleting ".\001.mts.idx" - file ".\001.mts" not found!..
    Deleting ".\003.mts.idx" - file ".\003.mts" not found!..
    Deleting ".\005.mts.idx" - file ".\005.mts" not found!..
    Deleting ".\007.mts.idx" - file ".\007.mts" not found!..
    Deleting ".\009.mts.idx" - file ".\009.mts" not found!..
    Deleting ".\011.mts.idx" - file ".\011.mts" not found!..
    Deleting ".\010.idx"     - file ".\010.mts" not found!..
    Deleting ".\012.idx"     - file ".\012.mts" not found!..
    

    • 注意:请注意使用cd /d "%~dp0",这样,它会使 bat 进入 bat 本身所在的文件夹并在其中工作。如果您将批处理保存在除要测试和/或执行删除文件操作的文件夹之外的其他文件夹中,则将其替换为您拥有 `*.mts、*.idx、*mts.idx 的文件夹的完整路径,格式如下:
    @echo off && setlocal
    
    cd /d "D:\The\Full\Path\To\Where\Your\Files\Are"
    ...
    

    1.定义输出命令 do/from 中要返回的内容的用途For /F "Delims=" .. (cmd),为无分隔符,因此它将使用整个输出行。

    ...
     
    for /f delims^= %%G in (' ...
       ');= do ...
    

    2.如前所述,where .:*.mts.idx将仅返回明确具有通配符所满足的名称布局的文件"any file in current folder = * " + ".String1" + ".String2"

    ...
    for /f ... (' @"%__AppDir__%where.exe" .:*.mts.idx ') do ... 
    

    3.使用循环call set _varible=File_Name定义当前变量中列出的文件的名称%~file_Name_from_G( ),使用循环定义当前变量中列出的文件的名称,然后使用:%%~nGcall setcall :Lable %%_variable_defined_and_already_expanded_on_the_same_line:SubString_remove/replace_String[.IDX]=[Nothing]%%_name:.idx=[NOTHING!!!]%

    ...
    
    for /f ( ... 
       ) do call set "_name=%%~nG" && call %:^) "%%_name:.idx=%%"
    

    4.您的流程将在 2 次情况下进入:Label,第一次是通过call :Label传递参数 1 ( %1) 的调用"%%_name:.idx=%%",第二次是在循环完成 fromFor /F循环中的文件列表时,此时不会调用:Lable,因此参数%1传递将不为真。然后,调用 + 参数 1 将满足真条件,而当在同一处理事件中没有调用且没有传递参数时,将满足假条件,从而按照:Label批处理中的行顺序到达 。

    当:Label没有调用 时,它会转到:Secound_Label,如果调用 ,它会依次检查 的存在Current_File_Name.mts,如果不存在,它会以 的形式返回发送文件的名称.idx的扩展名,并使用 退出/返回调用的(与相同),同样,在这个 中,如果文件存在,它会出现在deletedelete Current_File_Name.mts.idx:Labelgoto :End_Of_Fileexit /bif) else goto :eof

    ...
    
    :Lable
    if "%~1" == "" ( 
         goto :Secound_Label
       ) else if not exist ".\%~1" (
         echo/Deleting ".\%~1.idx" - file "%~1" not found!..
         @del /q /f /a ".\%~1.idx" & exit /b
        );= else goto :eOf 
    
    

    5.将:Secound_Label使用与第一个相同的机制/逻辑,但将使用重定向中的过滤器:Lable过滤已经在第一个循环中处理过的文件 ,从而限制仅在文件“Name_Any [.idx]”上执行,并且当没有找到“ .idx orfan文件”时,它将操作排除...For /F| FindString /aVoid AnyFileThatContains_a_Name_With[.mts.idx]

    ...
    
    :Secound_Label
    for /f usebackq^delims^= %%i in =;(
        `call "%windir%\System32\where.exe" .:*.idx ^| "%windir%\System32\find.exe" /v /i ".mts.idx"`
        );= do if not exist ".\%%~ni.mts" =;(
              echo/Deleting ".\%%~ni.idx"     - file ".\%%~ni.mts" not found!..
              @del /q /f /a ".\%%~ni.idx"
            );=
    

    6.是timeout -1一个暂停,省略使用常规文本的输出Press any key to continue ...并等待通过添加管道(重定向)来执行命令,|以结束Setlocal(使用Endlocal)并转到文件末尾,完成批处理执行,但会暂停,只要用户希望和/或发现有必要查看显示在先前操作中排除的文件名称的文本。

    ...
    
    "%windir%\System32\timeout.exe" -1 | endlocal & goto :eOf 
    

    进一步阅读:

    • CD /?

    • Set /?

    • For /?

    • For /F /?

    • Find /?

    • Where /?

    • Find /?

    • Setlocal | Endlocal /?

    • 使用:条件执行

      • ||和&&
    • 回到哪裡GOTO :EOF?

    • 使用:带重定向的命令

      • |,<,>,2>,2>&1, ETC。
    • 使用:Set _Varibel=SubStrings=Replace%

    • 这是什么%~dp0意思?它是如何起作用的?

    • ss64.com 上的 Windows CMD 命令 AZ 索引

    • 3
  2. Ricardo Bohner
    2024-09-17T19:37:16+08:002024-09-17T19:37:16+08:00

    您可以这样做,如果没有找到相应的视频文件,它会询问您是否要删除 idx (file\s)...

    @echo off
    
    :: Inform the folder where the videos and idx files are:
    set Folder=%userprofile%\desktop\Teste
    
    echo Would you like to delete this Files?
    
    for /f "tokens=*" %%a in ('dir /b "%Folder%\*.idx"') do for /f "tokens=*" %%b in ("%%~na") do if not exist "%Folder%\%%~na.mts" if not exist "%Folder%\%%~nb.mts" echo %%a
    
    set /p "Option=Press X to delete: "
    IF /i "%Option%"=="x" goto :Delete
    
    exit
    
    :Delete
    for /f "tokens=*" %%a in ('dir /b "%Folder%\*.idx"') do for /f "tokens=*" %%b in ("%%~na") do if not exist "%Folder%\%%~na.mts" if not exist "%Folder%\%%~nb.mts" del /q "%Folder%\%%a"
    exit
    
    • 2

相关问题

  • 如何使用 Audacity 拉伸较短的音轨以适合较长的视频

  • HTTP 上的视频 - 您能判断视频是正在下载还是正在观看吗?

  • OBS Studio—'无法打开 NVENC 编解码器:功能未实现'

  • 如何用ffmpeg 2.0.2保存TS视频流?

  • 压缩视频可以解码回未压缩的原始格式吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Vickel Firefox 不再允许粘贴到 WhatsApp 网页中? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve