我有一个包含图片的文件夹和子文件夹的未知列表,
我想以 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.1
、files.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 秒后删除/重置变量/值