Открытие случайного файла из папки И подпапок с помощью пакетного скрипта (Windows 7)
Я хочу получить файл bat, который откроет случайный файл (с любым расширением) из определенной папки, но также откроет файлы во всех подпапках в этой папке. Есть еще один вопрос, который задал что-то вроде этого ( Как открыть случайный файл в папке и установить, что должны открываться только файлы с указанным расширением (ями) имени файла?), И предоставил этот скрипт:
@echo off & setlocal
:: start of main
rem Set your path here:
set "workDir=C:\DVDCOVERS"
rem Read the %random%, two times is'nt a mistake! Why? Ask Bill.
rem In fact at the first time %random% is nearly the same.
@set /a "rdm=%random%"
set /a "rdm=%random%"
rem Push to your path.
pushd "%workDir%"
rem Count all files in your path. (dir with /b shows only the filenames)
set /a "counter=0"
for /f "delims=" %%i in ('dir /b ^|find "."') do call :sub1
rem This function gives a value from 1 to upper bound of files
set /a "rdNum=(%rdm%*%counter%/32767)+1"
rem Start a random file
set /a "counter=0"
for /f "delims=" %%i in ('dir /b ^|find "."') do set "fileName=%%i" &call :sub2
rem Pop back from your path.
popd "%workDir%"
goto :eof
:: end of main
:: start of sub1
:sub1
rem For each found file set counter + 1.
set /a "counter+=1"
goto :eof
:: end of sub1
:: start of sub2
:sub2
rem 1st: count again,
rem 2nd: if counted number equals random number then start the file.
set /a "counter+=1"
if %counter%==%rdNum% (start "" "%fileName%")
goto :eof
:: end of sub2
:: -snap--- end of batch
Источник: http://forums.majorgeeks.com/showthread.php?t=181574
Тем не менее, этот сценарий открывает только файлы, расположенные в основной папке и ни один из подпапок. Я уверен, что это простое решение, но я не могу понять это. Помощь очень ценится, спасибо.
2 ответа
Этот код не только случайным образом открывает файл в иерархии папок, но и более эффективен, чем оригинал:
@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
По умолчанию скрипт будет искать файлы в текущем каталоге, но вы можете передать корневой путь в качестве первого аргумента, и вместо этого он начнет искать там.
Код более эффективен при открытии только одного файла, но он действительно показывает улучшение, если вы хотите открыть несколько файлов, поскольку он должен генерировать список только один раз. Также более эффективно позволить FINDSTR находить выбранный файл, а не проходить по всему списку.
Я структурировал код, чтобы было легко открывать несколько случайных файлов. Ниже я случайно выбрал 25 и распечатал команду, чтобы открыть их. Просто удалите ECHO, чтобы фактически открыть файлы:
@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
В то время как код в ответе dbenham - то, что я использовал бы, только для альтернативы
@echo off
setlocal enableextensions disabledelayedexpansion
set "rootFolder=C:\DVDCOVERS"
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"
Код работает следующим образом:
- Выполняет рекурсивный
dir
команда. - Для каждого файла в списке отображается имя файла и случайное число.
- Сортирует список файлов. Поскольку к нему добавляется случайное число, порядок является случайным.
- Из списка извлекается первый файл.
- Полученная запись разделяется, отбрасывая начальное случайное число и запуская выбранный файл.
И да, он сильно загружает процессор, так как, чтобы он работал, один sort
команда и четыре cmd
экземпляры запущены.