2016-12-13 51 views
2

我想製作一個.bat文件,該文件將在與.bat文件相同的位置打開隨機文件夾/子文件夾內的第一個文件。播放位於隨機文件夾/子文件夾中的第一個視頻

我目前只有打開一個隨機文件的代碼。

@echo off 
setlocal enableextensions disabledelayedexpansion 

set "rootFolder=G:\Movies\Anime" 

for /f "usebackq tokens=1,* delims=:" %%a in (` 
    cmd /q /v /e /c "for /f delims^= %%a in ('dir /a-d /s /b "%rootFolder%"') do echo(!random!:%%a" 
    ^| sort 2^>nul 
    ^| cmd /q /e /v /c "set /p ".^=" & echo(!.!" 
`) do start "" "%%~b" 

我也有一個.bat文件生成與同一位置的所有文件夾列表的文本文件。我不確定是否可以更容易地引用它。

dir /b > Animelist.txt 

而且如果可能的話如何排除它打開特定類型的文件,如JPEG /其他.bat文件?

+0

代替'dir/ad/s/b「%rootFolder%」',編寫'dir/ad/s/b「%rootFolder%\ *。avi」「%rootFolder%\ *。mpg」 「%rootFolder%\ *。wmv」「%rootFolder%\ *。mp4」「%rootFolde r%\ *。m4v「」%rootFolder%\ *。mkv「...'只處理具有特定擴展名的文件... – aschipfl

回答

0

你可以用這個

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "rootFolder=%cd%" 
    set fileTypes= "*.avi" "*.mpeg" "*.mkv" 

    pushd "%rootFolder%" && (
     for /f "usebackq tokens=1,* delims=:" %%a in (` 
      cmd /q /v /e /c "set p=&for /r %%a in (%fileTypes%) do if not !f!==%%~dpa (set f=%%~dpa&set /a ((%random% %% 16273^)+1^)*!random!&echo :%%~dpa)" 
      ^| sort 2^>nul 
      ^| cmd /q /e /v /c "set /p ".^=" && echo(!.!" 
     `) do pushd "%%~b." && (
      for /f "delims=" %%c in (' 
       dir /b /a-d /on %fileTypes% 2^>nul 
       ^| cmd /q /e /v /c "set /p ".^=" && echo(!.!" 
      ') do start "" "%%~fc" 
      popd 
     ) 
     popd 
    ) 

嘗試在片將任務分解

  • 配置到哪裏去尋找什麼搜索(前兩個set
  • 變化到起始文件夾(pushd
    • 執行鍼對所指示的文件類型和輸出,其中該文件已被找到的文件夾的名稱(第一cmd遞歸搜索內部for /f
      • 作爲除以上一個文件可以在同一個文件夾中,檢查,我們將不輸出一個重複元件(if第一cmd內部)
    • 對於每個文件夾,生成芳andom號作爲前綴(set /a)和輸出文件夾(echo
    • 排序隨機數列表(sort
    • 獲取列表中的第一個文件夾。由於名單上的隨機數進行排序,此文件夾已隨機選擇(第二cmdfor /f %%a
    • 丟棄的隨機數,只檢索的文件夾(在for /f %%adelimstokens的原因)
  • 更改所選文件夾(pushd
    • 列表指示類型選擇的文件夾內的文件(dir
    • 從這個列表中選擇上LY第一文件(cmd
    • 檢索所選擇的文件(for /f %%c
    • 開始選定的文件(start
    • 返回(前一個文件夾(popd
  • 返回到起始夾popd
+0

嘿剛剛試過這個工程很好,只是在文件格式的幾個變種添加,遇到了一個問題,沒有發生在我身上。幾次運行.bat後,我發現它也會選擇隨機的子文件夾。 所以從我的例子來看,它會播放第一季到第五季的第一個視頻,比較適合從第一個子文件夾中選擇。 – Josh

+0

@Josh,如上所述*「...隨機文件夾/子文件夾內的第一個文件,...」*。您需要在問題中包含更多或至少更準確的問題信息。沒有它,我們只是猜測。 –

+0

對不起,謝謝你的幫助:) – Josh

0

隨機選擇一個文件夾是明確的。
first video file有點困難。如果使用帶有多個擴展名(如@aschipfl)的dir,則會預先確定要查找哪些擴展名並找到它們。
排除文件類型的另一種方法比較乏味,不知道可能會出現哪些類型。

這裏我的批處理編輯簡化的某些部分:

@echo off 
setlocal enableextensions Enabledelayedexpansion 
Set Cnt=0 
Set "Exclude=.bat$ .cmd$ .jpg$ .jpeg$ .txt$" 

Pushd "G:\Movies\Anime" 
(Echo::: Numbered List of folders 
    For /f "delims=" %%F in (
    'Dir /B/S/AD/ON' 
) Do Set /A Cnt+=1&Echo:!Cnt!:%%F 
)>DirList.txt 

:: Get Random num 1..Cnt 
Set /A RndDir=%Random% %% Cnt+1 

:: Get random folder name 
For /f "tokens=1,* Delims=:" %%F in (
    'Findstr "^%RndDir%:" DirList.txt ' 
) Do Set "DirName=%%G" 
Echo selected %RndDir% of %Cnt% = folder %DirName% 
Pushd "%DirName% 

Set "FileName" 
For /f "Delims=" %%F in (
    'Dir /B/A-D ^|findstr /i /V "%Exclude%"' 
) Do If Not defined FileName Set "FileName=%%~F" 
If defined FileName Start "" "%FileName%" 
Popd 
Popd 
Goto :Eof 
+0

文件格式在每個文件夾內都是一致的,所以對我來說這仍然可行,我可以將這看作是其他人面臨的問題,我唯一能想到的解決方案就是獲取文件的名稱和搜索數字,並分別在列表中排序並從中選擇第一個文件。 – Josh

相關問題