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"
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...
Para criar esses arquivos para meus testes, criei-os em uma pasta vazia e executei o comando abaixo:
Agora, com esses arquivos em uma pasta, sem ter certeza de seu objetivo ou cenário, tentei usar um
for /f
loop filtrando apenas os arquivoswhere any_name.mts.idx
. Isso ocorre porque owhere
comando 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.mts
não existir, então entendo que ele é para excluircurrent_name.mts.idx
...echo/Deleting ".\%~1" ...
: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 deany.idx
e/ouany.mts.idx
. Então, você teria que usar doisFor /F
loops, o segundo com um filtro específico para não manipular ocorrências do nome*.mts.idx
, que pode ser obtido comfind /aVoid
...echo/Deleting ".\%~1.idx" |or| ".\%%~ni.idx" ...
: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: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.2. Como já mencionado,
where .:*.mts.idx
retornará apenas arquivos que explicitamente tenham o layout do nome atendido pelo curinga"any file in current folder = * " + ".String1" + ".String2"
3. Use o
call set _varible=File_Name
para definir o nome do arquivo listado na variável atual%~file_Name_from_G
(%%~nG
) em um loop, use ocall set
para definir o nome do arquivo listado na variável atual em um loop e, em seguida, use acall :Lable %%_variable_defined_and_already_expanded_on_the_same_line:SubString_remove/replace_String[.IDX]=[Nothing]%
por%_name:.idx=[NOTHING!!!]%
:4. Seu fluxo entrará no
:Label
em 2 ocasiões, primeiro pela chamadacall :Label
onde você passa o argumento 1 (%1
)"%%_name:.idx=%%"
, e em um segundo momento quando o loop finalizar a listagem de arquivos dentro doFor /F
loop from , naquele momento não haverá chamada para o:Lable
, e portanto, a passagem do argumento%1
nã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:Label
na ordem da linha no lote.Quando o
:Label
não é chamado, ele vai para o:Secound_Label
, se for chamado, ele por sua vez verifica a existência doCurrent_File_Name.mts
e se ele não existir, ele retorna a.idx
extensão paradelete
o nome do arquivo enviado, no formato,delete Current_File_Name.mts.idx
, e sai/retorna do:Label
chamado comgoto :End_Of_File
(que é o mesmo queexit /b
), e similarmente nesteif
, se o arquivo existir, ele sai em) else goto :eof
5. O
:Secound_Label
utilizará a mesma mecânica/lógica do primeiro:Lable
, mas filtrará os arquivos já tratados no primeiroFor /F
loop 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...6. Há
timeout -1
uma pausa omitindo a saída com o texto regularPress any key to continue ...
e aguardando para executar os comandos adicionando o pipe (redirecionamento)|
encerra oSetlocal
(comEndlocal
) 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.Algumas leituras adicionais:
CD /?
Set /?
For /?
For /F /?
Find /?
Where /?
Find /?
Setlocal | Endlocal /?
Usando: Execução Condicional
||
e&&
Para onde
GOTO :EOF
retorna?Usando: Comandos com Redirecionamento
|
,<
,>
,2>
,2>&1
, etc.Usando:
Set _Varibel=SubStrings=Replace%
O que
%~dp0
significa e como funciona?Um índice AZ de comandos CMD do Windows em ss64.com
Você poderia fazer algo assim: se nenhum arquivo de vídeo correspondente for encontrado, ele perguntará se você deseja excluir o idx (arquivo\s)...