AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 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

Lote do Windows para comparar dois nomes de arquivo com incompatibilidade parcial

  • 772

Tenho um diretório com arquivos de vídeo e seus arquivos .idx correspondentes (ocultos). Ao excluir qualquer arquivo de vídeo, os arquivos .idx correspondentes permanecem. Quero excluir periodicamente esses arquivos .idx "não associados".

O script em lote abaixo consegue isso, mas só funciona quando o nome do arquivo .idx corresponde ao nome do arquivo de vídeo. ou seja: One.mts e One.idx . O problema é que, quando criados, os arquivos .idx têm uma extensão de arquivo Video anexada ao nome. Portanto, tenho One.mts e One.mts.idx .

Como posso fazer o código comparar os dois nomes ignorando a extensão adicional anexada no arquivo .idx? A melhor solução seria se eu pudesse fazer o código ignorar a parte .idx do arquivo enquanto ainda compara esses dois arquivos. Isso permitiria que outros tipos de vídeo fossem armazenados no mesmo diretório sem que seus arquivos .idx fossem excluídos porque não correspondiam ao nome do arquivo de vídeo .mts (eu acho).

Para sua informação: O fato dos arquivos .idx estarem ocultos não é um problema com o código abaixo.

@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 respostas
  • 162 Views

2 respostas

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

    Só para ter certeza de que entendi sua pergunta, mesmo com minhas dificuldades cognitivas em outros idiomas além da minha língua nativa...

    Considere que tenho uma pasta com os seguintes arquivos...

    .\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
    

    Para criar esses arquivos para meus testes, criei-os em uma pasta vazia e executei o comando abaixo:

    @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
    

    Agora, com esses arquivos em uma pasta, sem ter certeza de seu objetivo ou cenário, tentei usar um for /floop filtrando apenas os arquivos where any_name.mts.idx. Isso ocorre porque o wherecomando pode listar os arquivos neste layout de nome respondendo explicitamente aos nomes para uso de curinga no formato *.mts.idx.

    Como já obtenho os nomes dos arquivos de interesse em um loop, preciso apenas utilizar a condicional de arquivo inexistente para executar a ação de excluir seu arquivo órfão, então se o arquivo current_name.mtsnão existir, então entendo que ele é para excluir 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 
    
    • Saídas em lote // por 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!..
    

    Isso lida apenas com a parte de deletar os arquivos não correspondidos onde no nome você tem AnyName.mts.idx, mas se você se concentrou em receber uma resposta para lidar com a deleção dos nomes órfãos de any.idxe/ou any.mts.idx. Então, você teria que usar dois For /Floops, o segundo com um filtro específico para não manipular ocorrências do nome *.mts.idx, que pode ser obtido com 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 
    
    • Saídas em lote // por 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!..
    

    • Nota: Preste atenção ao uso de cd /d "%~dp0", onde dessa forma, ele faz o bat entrar e trabalhar dentro da pasta onde o próprio bat está. Se você salvar o batch em outra pasta que não seja a pasta onde você vai testar e/ou executar a ação de deletar seus arquivos, então substitua pelo caminho completo da pasta onde você tem o `*.mts, *.idx, *mts.idx no formato:
    @echo off && setlocal
    
    cd /d "D:\The\Full\Path\To\Where\Your\Files\Are"
    ...
    

    1. Defina o uso do que retornar no comando de saída do/from For /F "Delims=" .. (cmd), como sem delimitador, para que ele use a linha de saída inteira.

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

    2. Como já mencionado, where .:*.mts.idxretornará apenas arquivos que explicitamente tenham o layout do nome atendido pelo curinga"any file in current folder = * " + ".String1" + ".String2"

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

    3. Use o call set _varible=File_Namepara definir o nome do arquivo listado na variável atual %~file_Name_from_G( %%~nG) em um loop, use o call setpara definir o nome do arquivo listado na variável atual em um loop e, em seguida, use a call :Lable %%_variable_defined_and_already_expanded_on_the_same_line:SubString_remove/replace_String[.IDX]=[Nothing]%por %_name:.idx=[NOTHING!!!]%:

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

    4. Seu fluxo entrará no :Labelem 2 ocasiões, primeiro pela chamada call :Labelonde você passa o argumento 1 ( %1) "%%_name:.idx=%%", e em um segundo momento quando o loop finalizar a listagem de arquivos dentro do For /Floop from , naquele momento não haverá chamada para o :Lable, e portanto, a passagem do argumento %1não será verdadeira. Então a condição verdadeira será satisfeita pela chamada + argumento 1 e a condição falsa será satisfeita quando não houver chamada e nenhum argumento passado no mesmo evento de processamento, chegando assim ao :Labelna ordem da linha no lote.

    Quando o :Labelnão é chamado, ele vai para o :Secound_Label, se for chamado, ele por sua vez verifica a existência do Current_File_Name.mtse se ele não existir, ele retorna a .idxextensão para deleteo nome do arquivo enviado, no formato, delete Current_File_Name.mts.idx, e sai/retorna do :Labelchamado com goto :End_Of_File(que é o mesmo que exit /b), e similarmente neste if, se o arquivo existir, ele sai em) 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. O :Secound_Labelutilizará a mesma mecânica/lógica do primeiro :Lable, mas filtrará os arquivos já tratados no primeiro For /Floop utilizando o filtro no redirecionamento | FindString /aVoid AnyFileThatContains_a_Name_With[.mts.idx], restringindo assim a execução apenas nos arquivos `Nome_Qualquer[.idx], e quando nenhum arquivo `.idx orfan'' for encontrado, operará a exclusão...

    ...
    
    :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. Há timeout -1uma pausa omitindo a saída com o texto regular Press any key to continue ...e aguardando para executar os comandos adicionando o pipe (redirecionamento) |encerra o Setlocal(com Endlocal) e vai para o final do arquivo, finalizando a execução em lote, mas pausa pelo tempo que o usuário desejar e/ou achar necessário para ver o texto exibindo os nomes dos arquivos excluídos nas ações anteriores.

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

    Algumas leituras adicionais:

    • CD /?

    • Set /?

    • For /?

    • For /F /?

    • Find /?

    • Where /?

    • Find /?

    • Setlocal | Endlocal /?

    • Usando: Execução Condicional

      • ||e&&
    • Para onde GOTO :EOFretorna?

    • Usando: Comandos com Redirecionamento

      • |, <, >, 2>, 2>&1, etc.
    • Usando:Set _Varibel=SubStrings=Replace%

    • O que %~dp0significa e como funciona?

    • Um índice AZ de comandos CMD do Windows em ss64.com

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

    Você poderia fazer algo assim: se nenhum arquivo de vídeo correspondente for encontrado, ele perguntará se você deseja excluir o idx (arquivo\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

relate perguntas

  • Como esticar uma faixa de áudio mais curta para caber em um vídeo mais longo com o Audacity

  • Vídeo sobre HTTP - você pode dizer se um vídeo está sendo baixado ou assistido?

  • OBS Studio—'Falha ao abrir o codec NVENC: função não implementada'

  • Como salvar o fluxo de vídeo TS com ffmpeg 2.0.2?

  • Os vídeos compactados podem ser decodificados de volta ao formato original não compactado?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Vickel O Firefox não permite mais colar no WhatsApp web? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve