使用批处理脚本从文件夹和子文件夹中打开随机文件(Windows 7)

Ces*_*sar 2 windows-7 open batch-file

我想获得一个 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
Run Code Online (Sandbox Code Playgroud)

来源:http : //forums.majorgeeks.com/showthread.php?t=181574

但是,此脚本仅打开位于主文件夹中的文件,而不会打开子文件夹中的文件。我确定修复是一个简单的修复,但我无法弄清楚。非常感谢帮助,谢谢。

dbe*_*ham 6

这段代码不仅可以随机打开文件夹层次结构中任意位置的文件,而且比原始代码更高效:

@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
Run Code Online (Sandbox Code Playgroud)

默认情况下,脚本将查找当前目录下的文件,但您可以将根路径作为第一个参数传递,它会开始查找那里。

代码在只打开一个文件时效率更高,但如果你想打开多个文件,它确实显示了改进,因为它只需要生成一次列表。让 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
Run Code Online (Sandbox Code Playgroud)