如何打开目录中的随机图片?

如何打开目录中的随机图片?

我有一个包含图片的文件夹和子文件夹的未知列表,
我想以 30 秒的间隔运行 10 张随机图片,
如果可能的话,在计时器到期后关闭前一张。

我尝试自己组装,但我没有足够的知识来做到这一点

@echo off
setlocal enabledelayedexpansion
TIMEOUT [/T] timeout [/NOBREAK]
set list=d
set e=0
set papka = cd /d "%~dp0

for /d /r %papka% %%i in (*.*) do (
  @if exist "%%i" (
    @set _variable=%%i
    @echo !_variable!
    for %%f   in (%_variable% *.jpg, *.jpeg, *.gif, *.png) do (
      @echo Filename: '%%f'
      set list=%list%;%%f 
      set /a e+=1
      @echo count: %e%
    )

    )
  )



for %%a in (%list%) do ( 
 @echo %%a
)


set n=0
for %%f in (*.jpg, *.jpeg, *.gif, *.png) do set /a n+=1
echo Total files %n%

set /a i = %RANDOM% %% n
echo Going to open %i%

set q=0
for %%f in (*.jpg, *.jpeg, *.gif, *.png) do (
  if %i%==!q! set file=%%f
  set /a q+=1
)
echo Filename: %file%
start "" "%file%"
pause

for %%f in (%_variable% *.jpg, *.jpeg, *.gif, *.png)
试图强制从 _variable 的路径上搜索图片
但我只从第一个文件夹获取文件,我需要从文件夹沿着路径到 _variable
之后我想把所有图片的路径放入一个数组
并获取一个随机索引

set list="D:\temp\Desktop\605e4478cc373aa28530b2a05273b4e3.jpg"
set e=0
set papka = cd /d "%~dp0
start "" "D:\temp\Desktop\605e4478cc373aa28530b2a05273b4e3.jpg"

for /d /r %papka% %%i in (*.*) do (
  @if exist "%%i" (
    @set _variable=%%i
    @echo Folder !_variable!
    for %%f   in (%_variable% *.jpg, *.jpeg, *.gif, *.png) do (
      @echo PathFile: '!_variable!\%%f'
      set list=%list%;!_variable!\%%f
      set /a e+=1
      @echo count: %e%
    )

    )
  )

pause
for %%a in (%list%) do ( 
start "" "%a%"
)
pause

我明白了

Folder D:\temp\Desktop\Folder\Folder (5)\Folder
PathFile: 'D:\temp\Desktop\Folder\Folder (5)\Folder\01beeb78e0cdce4e6846629a6b8d0626.jpg'
count: 0
PathFile: 'D:\temp\Desktop\Folder\Folder (5)\Folder\605e4478cc373aa28530b2a05273b4e3.jpg'
count: 0
Folder D:\temp\Desktop\Folder\Folder (5)\Folder (2)
PathFile: 'D:\temp\Desktop\Folder\Folder (5)\Folder (2)\01beeb78e0cdce4e6846629a6b8d0626.jpg'
count: 0
PathFile: 'D:\temp\Desktop\Folder\Folder (5)\Folder (2)\605e4478cc373aa28530b2a05273b4e3.jpg'
count: 0
Folder D:\temp\Desktop\Folder\Folder (5)\Folder (2)\3
PathFile: 'D:\temp\Desktop\Folder\Folder (5)\Folder (2)\3\01beeb78e0cdce4e6846629a6b8d0626.jpg'
count: 0
PathFile: 'D:\temp\Desktop\Folder\Folder (5)\Folder (2)\3\605e4478cc373aa28530b2a05273b4e3.jpg'
count: 0

答案1

我会强烈建议使用 PowerShell 而不是 Cmd 编写脚本。它更加一致 - 并且只需一行代码即可完成任务:

Start-Process (Get-ChildItem -File -Recurse | Get-Random)

(或者,使用默认别名,start (dir -file -recurse | get-random)。)

我需要从文件夹沿路径到_variable

然后将它们连接在一起:

set list=%list%;!_variable!\%%f

或者:

set list=%list%;%%i\%%f

因为“父”迭代器变量在这里仍然可以访问。

我尝试强制从 _variable 搜索图片

这里您不需要for /f- 而且您可能也不需要for /d;您可以直接使用以下命令执行递归搜索for /r

for /r %dir% %%f in (*.jpg *.jpeg *.png) do ...

请注意,列表是空间-分隔,而不是用逗号分隔。

之后我想把所有图片的路径放入一个数组中

Cmd 脚本没有数组。充其量,您可以使用包含空格分隔名称的大量字符串变量(如果文件名本身有空格,则无法使用!)来模拟数组,或者使用延迟扩展和大量编号变量(“可变变量”),例如!files.%i%!访问变量files.1files.2等。for...我怀疑,您当前执行两次循环的解决方案可能会比这更好。

答案2

@echo off && cd /d "D:\The\Full\Path\To\Your\Pictures\Images\Folder"

%:^)
setlocal enabledelayedexpansion

for /f delims^= %%G in =;(' dir /o:-d /on /b *.jpg *.jpeg *.gif *.png ^| findstr /xig:.\list.txt ^| find /v /c ""
    ');= do set /a "_total=%%~G, _cnt=1" && echo/Total files: 00%%~G

for /f usebackq^delims^= %%G in =;(` dir /o:-d /on /b *.jpg *.jpeg *.gif *.png ^| findstr /r .* ^| findstr /xig:.\list.txt
    `);= do call set /a "_i+=1+0" && call set "_f_%%_i%%=%%~G" && call set "_nx_i=%%~nxG"

for /l %%L in =;( 001, 001, !_total! );= do if !_cnt! equ 1 =;(
      set /a "_rand_1=!random!*!_total!/32768+1, _x=!random!*!_total!/32768+1, _cnt+=1"
    );= >nul else if !_cnt! leq 30 =;( 
      set _rand_ | findstr /e "_rand_..=!_x!" || call set /a "_rand_!_cnt!=!_x!, _x=!random!*!_total!/32768+1, _cnt+=1"
    );= >nul else goto %:^[

timeout /t 30 /nobreak | >nul =;(
     for /l %%L in =;( 01,01,10 );= do %ComSPec% /v /c "<con: call start "" "!_f_%%_rand_%%~L%%!"" 
    );= & endlocal & goto %:^)

您要做的工作比看起来更复杂,涉及:

1.检查文件列表输出并检查文件中是否列出

2.获取列表中现有文件的总和(不包括不存在的文件)

3.将文件逐个保存在数组中,并以索引形式使其“可检索”

4.运行时监控指向随机值的每个定义的值

5.检查是否有任何随机值重复生成,并且在“唯一”的情况下,之后创建与数组中预定义数组变量相关联的变量(也是以非重复的方式)

6.新循环超时 30 秒后删除/重置变量/值


相关内容