正如标题所说,我正试图从文件夹中挑选最多四个随机文件(壁纸),以便进一步处理。该文件夹不包含子文件夹,只有* .jpg,* .bmp和* .png(它的可能包含Thumbs.db文件,但我已经处理过了。)<登记/>
我用for
循环读取所有文件,使得类似于数组,然后我想运行另一个for
循环来制作随机数,选择文件的索引。
setlocal enabledelayedexpansion
set "wps=1 2 3 4"
set /a ind = 0
for /f "tokens=* delims=" %%g in ('dir C:\Wallpapers /a:-h-s /b /s') do (
set /a ind += 1
set "!ind!=%%g"
)
for %%g in (%wps%) do (
set /a "num = (((!random! & 1) * 1073741824) + (!random! * 32768) + !random!) %% %ind% + 1"
echo Wallpaper %%g is #!num! - Title: "!!num!!"
)
当然,回音的线只输出Wallpaper 1 is #118 - Title: "118"
而不是Wallpaper 1 is #118 - Title: "C:\Wallpapers\Miami Skyline.jpg"
。
所以我的具体问题是:如何在for
循环内双重展开变量?
[注意#1:创建随机数的行需要这么长,因为它可以提供良好的随机值分布]
[注意#2:我需要wps
以这种方式存储,因为有时我只需要三个壁纸,不一定按数字顺序排列]
答案 0 :(得分:1)
转移!num! FOR变量的值: - )
for %%N in (!num!) do echo Wallpaper %%g is #%%N - Title: "!%%N!"
一些额外的指示:
如上所述,您的DIR命令包含文件夹。您需要添加/A-D
选项
dir C:\Wallpapers /a:-h-s-d /b /s
您的数字变量名称适用于现有代码。但是如果您尝试使用常规扩展来访问它们,那么您将会适应,因为%1%
将扩展为第一个批处理参数而不是环境变量。在一般实践中,您应该避免使用数字开始环境变量。你可以使用:
set wp!ind!=%%g
...
echo Wallpaper %%g is #!num! - Title: "!wp%%N!
您可以通过在循环底部而不是顶部递增计数器来使数组成为0。然后,您无需在随机数中添加一个。 (这个提示很简单。更多的是风格问题。)
您不需要"tokens=*"
和"delims="
。我推荐后者。 "delims="
将保留整个字符串。 tokens=*
将在之后保留整个字符串,它会删除前导空格和制表符。文件名可以以空格开头。
如果任何文件名包含!
个字符,您的代码将失败。由于扩展延迟,%%g
扩展期间感叹号将被破坏。通过切换延迟扩展以及使用FOR变量在ENDLOCAL屏障上传输值,可以很容易地修复。
以下是包含所有建议的代码
@echo off
setlocal disableDelayedExpansion
set "wps=1 2 3 4"
set /a ind = 0
for /f "tokens=* delims=" %%g in ('dir C:\Wallpapers /a:-h-s-d /b /s') do (
setlocal enableDelayedExpansion
for %%N in (!ind!) do (
endlocal
set "wp%%N=%%g"
)
set /a ind += 1
)
setlocal enableDelayedExpansion
for %%g in (%wps%) do (
set /a "num = (((!random! & 1) * 1073741824) + (!random! * 32768) + !random!) %% %ind%"
for %%N in (!num!) do echo Wallpaper %%g is #%%N - Title: "!wp%%N!"
)
答案 1 :(得分:0)
您可以使用其他FOR,如dbenham建议,或者您可以使用CALL
call echo Wallpaper %%g is #!num! - Title: "%%!num!%%"
CALL
第二次扩展一行,但只有百分比扩展,在行的第二次重新分析中,延迟和FOR循环扩展都不起作用。
编辑:仅当num的内容不以数字开头时才有效。
但您可以使用cmd /c
进行第二次扩展,然后它也可以使用数字名称。
cmd /c echo Wallpaper %%g is #!num! - Title: "%%!num!%%"