Reproduz o filme / episódio aleatório dentro de uma pasta a partir do seu menu de contexto

3

O objetivo

Eu tenho uma coleção de mídia relativamente expansiva armazenada localmente na minha máquina dentro de duas pastas pai ("Filmes" e "Shows"). Meu objetivo é poder reproduzir aleatoriamente qualquer um dos filmes ou episódios que eu tenha dentro dessas pastas clicando com o botão direito do mouse na pasta principal e selecionando um item "Reproduzir filme / episódio aleatório" no menu de contexto estendido.

O script em lote

Eu tenho o seguinte script em lote armazenado em uma pasta na minha máquina com Windows 7, que eu tirei daqui e adaptei para procurar os arquivos .mp4 , .mkv e .avi (todas as extensões que minha coleção de mídia contém):

@echo off   
setlocal

:: Create numbered list of files in a temporary file
set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt"
dir *.mp4,*.mkv,*.avi /b /s /a-d %1 | findstr /n "^" >"%tempFile%" & REM "

:: Count the files
for /f %%N in ('type "%tempFile%" ^| find /c /v ""') do set cnt=%%N
call :openRandomFile

:: Delete the temp file
del "%tempFile%"
exit /b

:openRandomFile
set /a "randomNum=(%random% %% cnt) + 1"
for /f "tokens=1* delims=:" %%A in (
  'findstr "^%randomNum%:" "%tempFile%"'
) do start "" "%%B"

exit /b

O item de menu de contexto

Para adicionar um item de menu de contexto estendido para executar o arquivo em lotes acima, criei as seguintes chaves de registro, o que resulta em um item de menu de contexto nas pastas que executam o arquivo em lotes no caminho especificado quando clicado.

[HKEY_CLASSES_ROOT\Directory\shell\Play random movie/episode]
"Extended"=""
"Position"="Top"

[HKEY_CLASSES_ROOT\Directory\shell\Play random movie/episode\command]
@="\"B:\Users\Hashim\Resources\Windows Modding\Play Random.bat\" \"%1\""

Onde estou preso

A chave de registro parece funcionar bem o suficiente - o item aparece no menu de contexto estendido para pastas:

... e quando clicado, ele executa o arquivo em lote. Os problemas estão na execução do script.

  1. Em vez de selecionar apenas os formatos de arquivo .mkv , .mp4 e .avi , o script seleciona todos os tipos de arquivo.

  2. Em vez de pesquisar, listar e selecionar arquivos na pasta de destino - a pasta na qual o script está selecionado para ser executado no menu de contexto do botão direito do mouse -, ele é executado no que parece ser a pasta pai do a pasta de destino e todas as subpastas. Como a pasta de destino, nesse caso, está no diretório de pastas do usuário, isso significa essencialmente que ele seleciona aleatoriamente arquivos de toda a unidade de usuário.

Esses problemas persistem apesar do fato de que o script usa dir *.mp4,*.mkv,*.avi /b /s /a-d %1 para enumerar os arquivos, onde %1 é o parâmetro para a pasta de destino.

Por que o script não está funcionando como esperado? O que eu perdi aqui?

    
por Hashim 24.08.2017 / 00:40

1 resposta

3

Ponto 1 da sua conclusão:

Instead of selecting just the .mkv, .mp4 and .avi file formats, the script selects all file types.

É claro no comando

dir *.mp4,*.mkv,*.avi /b /s /a-d %1

Isso inicia 4 varreduras, 3 do diretório atual com as respectivas extensões e uma para o valor% 1 passado

Sugiro que você faça primeiro um CD /D "%~1" para que o diretório funcione a partir desse local.

@echo off   
setlocal
CD /D "%~1"
:: Create numbered list of files in a temporary file
set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt"
dir /b /s /a-d *.mp4,*.mkv,*.avi | findstr /n "^" >"%tempFile%" & REM "
    
por 24.08.2017 / 15:13