Esse código não apenas abre aleatoriamente um arquivo em qualquer lugar dentro da hierarquia de pastas, como também é mais eficiente que o original:
@echo off
setlocal
:: Create numbered list of files in a temporary file
set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt"
dir /b /s /a-d %1 | findstr /n "^" >"%tempFile%"
:: 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
Por padrão, o script procurará arquivos no diretório atual, mas você pode passar um caminho raiz como o primeiro argumento e começará a procurar lá.
O código é mais eficiente ao abrir apenas um arquivo, mas ele realmente mostra melhorias se você deseja abrir vários arquivos, pois ele só precisa gerar a lista uma vez. Também é mais eficiente deixar o FINDSTR localizar o arquivo selecionado em vez de percorrer toda a lista.
Eu estruturei o código para facilitar a abertura de vários arquivos aleatórios. Abaixo, seleciono aleatoriamente 25 e imprimo o comando para abri-los. Simplesmente remova o ECHO para realmente abrir os arquivos:
@echo off
setlocal
:: Create numbered list of files in a temporary file
set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt"
dir /b /s /a-d %1 | findstr /n "^" >"%tempFile%"
:: Count the files
for /f %%N in ('type "%tempFile%" ^| find /c /v ""') do set cnt=%%N
:: Open 25 random files
for /l %%N in (1 1 25) do 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 echo start "" "%%B"
exit /b