Spielen Sie einen zufälligen Film oder eine Episode in einem Ordner über das Kontextmenü ab

405
Hashim

Das Ziel

Ich habe eine relativ umfangreiche Mediensammlung, die lokal auf meinem Computer in zwei übergeordneten Ordnern ("Movies" und "Shows") gespeichert ist. Mein Ziel ist es, beliebige Filme oder Episoden in diesen Ordnern nach dem Zufallsprinzip wiedergeben zu können, indem Sie mit der rechten Maustaste auf den übergeordneten Ordner klicken und im erweiterten Kontextmenü die Option "Zufälligen Film / Episode abspielen" auswählen.

Das Batch-Skript

Ich habe das Skript folgende Charge in einem Ordner auf meinem Windows 7 Maschine gespeichert, die ich von hier aus nahm und angepasst zu suchen .mp4, .mkvund .aviDateien (alle Erweiterungen, die meine Mediensammlung besteht aus):

@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 

Das Kontextmenüelement

Um ein erweitertes Kontextmenüelement zum Ausführen der obigen Stapeldatei hinzuzufügen, habe ich die folgenden Registrierungsschlüssel erstellt, die zu einem Kontextmenüelement in Ordnern führen, in denen die Stapeldatei unter dem angegebenen Pfad ausgeführt wird, wenn Sie darauf klicken.

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

Wo stecke ich fest?

Der Registrierungsschlüssel scheint gut zu funktionieren - das Element wird im erweiterten Kontextmenü für Ordner angezeigt:

Spielen Sie einen zufälligen Film oder eine Episode in einem Ordner über das Kontextmenü ab

... und wenn Sie darauf klicken, wird die Batchdatei ausgeführt. Die Probleme liegen in der Ausführung des Skripts.

  1. Anstatt nur die Dateiformate und auszuwählen .mkv, wählt das Skript alle Dateitypen aus..mp4.avi

  2. Anstatt nach Dateien innerhalb des Zielordners zu suchen, den Ordner auszuwählen, für den das Skript im Kontextmenü des Kontextmenüs ausgeführt wird, wird es stattdessen in einem Ordner ausgeführt, der scheinbar der übergeordnete Ordner des Zielordners und aller Unterordner ist . Da sich der Zielordner in diesem Fall im Benutzerordner-Verzeichnis befindet, bedeutet dies im Wesentlichen, dass er zufällig Dateien vom gesamten Benutzerlaufwerk auswählt.

Diese Probleme bestehen weiterhin, obwohl das Skript dir *.mp4,*.mkv,*.avi /b /s /a-d %1zum Auflisten der Dateien verwendet wird, wobei %1der Parameter für den Zielordner angegeben ist.

Warum funktioniert das Skript nicht wie erwartet? Was habe ich hier vermisst?

3
Kommentieren Sie "@echo off" aus und sehen Sie, was Ihre Batchdatei macht. DavidPostill vor 6 Jahren 0
[Debuggen Ihrer Batchdateien] (http://www.robvanderwoude.com/battech_debugging.php) DavidPostill vor 6 Jahren 0
@DavidPostill - Ich habe Zeit damit verbracht, es zu debuggen, so kam ich von der letzten Iteration der Frage zu dieser Frage. Ich hatte es tatsächlich getan, bevor Sie Ihre Kommentare zur letzten Frage gepostet hatten, brauchte aber etwas Zeit, um zu schlafen. Diese aktuelle Iteration ist das Ergebnis all der Fehlersuche, die ich ausführen konnte, und ich überlasse es nun SU, um mir zu helfen, herauszufinden, was ich nicht konnte. Ebenso wie bei einer Info-Info funktioniert Ihr Link zur Rob van der Woude-Site nicht, da diese Site nicht mit "https" arbeitet. Hashim vor 6 Jahren 0
Link behoben ..... DavidPostill vor 6 Jahren 0

1 Antwort auf die Frage

3
LotPings

Punkt 1 aus Ihrer Schlussfolgerung:

Anstatt nur die Dateiformate .mkv, .mp4 und .avi auszuwählen, wählt das Skript alle Dateitypen aus.

Ist aus dem Befehl klar

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

Dadurch werden 4 Scans ausgelöst, 3 vom aktuellen Verzeichnis mit den entsprechenden Erweiterungen und einer für den übergebenen% 1-Wert

Ich schlage vor, dass Sie zuerst ein CD /D "%~1"Verzeichnis ausführen, um das Verzeichnis von diesem Standort aus arbeiten zu lassen.

@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, super Fang, vielen Dank dafür. Ich wusste, dass es so einfach sein würde, ich hätte es wirklich nicht vermissen sollen. Gibt es aus Interesse einen bestimmten Grund, warum Sie "% ~ 1" verwendet haben? Da durch das Hinzufügen von "~" die Variable nur ohne Anführungszeichen erweitert wird, können Sie die Variable nicht ohne Anführungszeichen an erster Stelle mit "% 1" referenzieren? Ich habe das Skript mit "% 1" getestet und bestätigt, dass es funktioniert. Ich frage mich, ob es irgendwelche Nachteile bei der Verwendung gibt, die Sie im Sinn hatten? Hashim vor 6 Jahren 0
Es ist nur eine Angewohnheit - wenn man nicht genau weiß, was passiert wird. Wenn die Anführungszeichen immer in Anführungszeichen eingeschlossen werden, werden sie möglicherweise verdoppelt, sodass durch das Einschließen und Entfernen eventuell vorhandener Anführungszeichen der neu übergebene Wert in Anführungszeichen gesetzt wird. LotPings vor 6 Jahren 0
Ich mag diese Angewohnheit mit der Tilde ... Ich benutze die meiste Zeit selbst für den Fall, dass ich nie ein Problem damit habe, aber ich habe es nicht. +1 Pimp Juice IT vor 6 Jahren 1