Riproduce film / episodi casuali all'interno di una cartella dal menu di scelta rapida


4

L'obiettivo. il gol

Ho una raccolta multimediale espansiva relativamente locale memorizzata sul mio computer all'interno di due cartelle principali ("Film" e "Spettacoli"). Il mio obiettivo è di essere in grado di riprodurre a caso uno qualsiasi dei film o degli episodi che ho all'interno di queste cartelle facendo clic con il tasto destro sulla cartella principale e selezionando una voce "Riproduci film / episodio casuale" dal menu di scelta rapida esteso.

Lo script batch

Ho il seguente script batch memorizzato in una cartella sulla mia macchina Windows 7, che io preso da qui e adatto a cercare .mp4, .mkv e .avi file (tutte le estensioni della mia raccolta multimediale):

@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

La voce del menu contestuale

Per aggiungere una voce di menu contestuale estesa per eseguire il suddetto file batch, ho creato le seguenti chiavi del Registro di sistema, che si traducono in una voce di menu di scelta rapida sulle cartelle che esegue il file batch nel percorso specificato quando si fa clic.

[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\""

Dove sono bloccato

La chiave di registro sembra funzionare abbastanza bene: l'elemento viene visualizzato nel menu di scelta rapida esteso per le cartelle:

enter image description here

... e quando viene cliccato, esegue il file batch. I problemi si trovano nell'esecuzione della sceneggiatura.

  1. Invece di selezionare solo il .mkv, .mp4 e .avi formati di file, lo script seleziona tutti i tipi di file.

  2. Invece di cercare, elencare e selezionare dai file all'interno della cartella di destinazione - la cartella in cui lo script è selezionato per l'esecuzione dal suo menu di scelta rapida con clic con il pulsante destro - viene eseguito invece su quella che sembra essere la cartella principale della cartella di destinazione e tutte le sottocartelle . Poiché la cartella di destinazione in questo caso si trova nella directory delle cartelle utente, ciò significa essenzialmente che seleziona in modo casuale i file dell'intera unità dell'utente.

Questi problemi persistono nonostante il fatto che lo script usi dir *.mp4,*.mkv,*.avi /b /s /a-d %1 per enumerare i file, dove %1 è il parametro per la cartella di destinazione.

Perché lo script non funziona come previsto? Cosa mi sono perso qui?


Commentare @echo off e guarda cosa sta facendo il tuo file batch.
DavidPostill


@DavidPostill - Ho passato del tempo a debuggarlo, è come ho ottenuto dall'ultima iterazione della domanda a questo. L'ho fatto davvero prima di pubblicare i tuoi commenti sull'ultima domanda, ma avevo bisogno di un po 'di tempo per dormire. Questa attuale iterazione è il risultato di tutto il debug che sono stato in grado di fare, e ora lo lascio su SU per aiutarmi a capire cosa non sono stato in grado di fare. Inoltre, proprio come una FYI, il tuo link al sito di Rob van der Woude non funziona come quel sito non usa https.
Hashim

Link fisso .....
DavidPostill

Risposte:


4

Punto 1 dalla tua conclusione:

Invece di selezionare solo i formati di file .mkv, .mp4 e .avi, lo script seleziona tutti i tipi di file.

È chiaro dal comando

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

Questo avvia 4 scansioni, 3 dalla directory corrente con le rispettive estensioni e una per il valore% 1 passato

Ti suggerisco di fare prima un CD /D "%~1" per far funzionare la directory da quella posizione.

@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 "

Wow, ottima cattura, grazie mille per questo. Sapevo che sarebbe stato così semplice, non avrei davvero dovuto mancarlo. Per interessi, c'è qualche ragione particolare che hai usato "%~1"? Dall'aggiunta del ~ semplicemente espande la variabile senza virgolette, potresti non solo fare riferimento alla variabile senza virgolette in primo luogo, con %1? Ho testato lo script usando %1 e ha confermato che funziona, quindi mi chiedo se ci siano degli svantaggi nell'usarlo che avevi in ​​mente?
Hashim

1
È solo un'abitudine - se non sai esattamente cosa è passato. Se si racchiudono sempre tra virgolette, potrebbero essere raddoppiate, quindi racchiudere e rimuovere i preventivi presenti alla fine assicura che il nuovo valore passato sia quotato.
LotPings

1
Mi piace quell'abitudine con la tilde ... Io la uso quasi sempre, perché non ho mai avuto un problema con esso, ma ho avuto il non averlo. +1
Pimp Juice IT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.