1

Я хочу получить файл 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 ответа2

5

Этот код не только случайным образом открывает файл в любом месте иерархии папок, он также более эффективен, чем оригинал:

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

В то время как код в ответе 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"

Код работает следующим образом:

  1. Выполняет рекурсивную команду dir .
  2. Для каждого файла в списке отображается имя файла и случайное число.
  3. Сортирует список файлов. Поскольку к нему добавляется случайное число, порядок является случайным.
  4. Из списка извлекается первый файл.
  5. Полученная запись разделяется, отбрасывая начальное случайное число и запуская выбранный файл.

И да, он сильно загружает процессор, так как для его работы запускается одна команда sort и четыре экземпляра cmd .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .