Random Windows批处理文件-在一个文件夹中拾取(最多)四个随机文件
正如标题所说,我试图从一个文件夹中随机选取四个文件(壁纸),以便进一步处理。该文件夹不包含子文件夹,仅包含*.jpg、*.bmp和*.png(它可能包含Thumbs.db文件,但我已经处理过了)。Random Windows批处理文件-在一个文件夹中拾取(最多)四个随机文件,random,batch-file,for-loop,variable-expansion,delayedvariableexpansion,Random,Batch File,For Loop,Variable Expansion,Delayedvariableexpansion,正如标题所说,我试图从一个文件夹中随机选取四个文件(壁纸),以便进一步处理。该文件夹不包含子文件夹,仅包含*.jpg、*.bmp和*.png(它可能包含Thumbs.db文件,但我已经处理过了)。 我用一个类似于数组的for循环读取所有文件,然后我想运行另一个for循环,生成随机数,作为选择文件的索引。 setlocal enabledelayedexpansion set "wps=1 2 3 4" set /a ind = 0 for /f "tokens=* delims=" %%g i
我用一个类似于数组的
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!!"
)
当然,只输出
墙纸1的行是#118-Title:“118”
而不是墙纸1是#118-Title:“C:\wallps\Miami Skyline.jpg”
因此,我的具体问题是:如何在
循环中对变量进行双重展开?
[注意#1:创建随机数的行需要如此长,因为它提供了良好的值随机分布]
[注意#2:我需要
wps
以这种方式存储,因为有时我可能只需要三张壁纸,不一定是数字顺序]传输!号码!变量的值:-)
另外还有几个要点:
- 如前所述,DIR命令包含文件夹。您需要添加
选项/A-D
dirc:\wallpaps/a:-h-s-d/b/s
- 数字变量名在现有代码中工作。但是,如果您尝试使用普通扩展来访问它们,您将遇到一些问题,因为
将扩展为第一批参数,而不是环境变量。一般情况下,应避免以数字开头环境变量。您可以使用:%1%
设置wp!ind!=%%g
…
echo壁纸%%g是#!num!-标题:“!wp%%N!
- 通过增加循环底部而不是顶部的计数器,可以使数组基于0。这样,就不需要向随机数中添加一个计数器。(这个技巧很简单。更多的是风格问题。)
- 您不需要同时使用
和“tokens=*”
”。我建议使用后者。“delims=“
将保留整个字符串。“delims=“
将在删除前导空格和制表符后保留整个字符串。文件名可以以空格开头tokens=*
- 如果任何文件名包含
字符,您的代码将失败。在扩展!
时,感叹号将由于延迟扩展而损坏。通过打开延迟扩展和of并使用FOR变量跨ENDLOCAL屏障传输值,修复此问题相当容易%%g
@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!"
)
将!num!值传递给FOR变量:-) 另外还有几个要点:
- 如前所述,您的DIR命令包含文件夹。您需要添加
选项/A-D
dirc:\wallpaps/a:-h-s-d/b/s
- 数值变量名在现有代码中有效。但如果您尝试使用正常扩展访问它们,则会出现不匹配,因为
将扩展为第一批参数,而不是环境变量。通常情况下,应避免以数字开头环境变量。您可以使用:%1%
设置wp!ind!=%%g
…
echo壁纸%%g是#!num!-标题:“!wp%%N代码>
- 通过增加循环底部而不是顶部的计数器,可以使数组基于0。那么你不需要在你的随机数上加一个。(这个技巧很琐碎,更多的是风格问题。)
- 您不需要同时使用
和“tokens=*”
”。我推荐后者“delims=“
将保留整个字符串“delims=“
在去掉前导空格和制表符后,将保留整个字符串。文件名可以以空格开头tokens=*
- 如果任何文件名包含
,代码将失败代码>字符。由于扩展延迟,在扩展
期间感叹号将被损坏。通过切换延迟扩展的on和of,并使用FOR变量跨ENDLOCAL屏障传递值,可以相当容易地修复此问题%%g
@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!"
)
您可以使用另一个,如dbenham建议的,也可以使用
CALL
call echo Wallpaper %%g is #!num! - Title: "%%!num!%%"
调用
第二次扩展一行,但在该行的第二次重新分析中,只有百分比扩展(既不是延迟的,也不是FOR循环扩展)起作用
编辑:仅当num的内容不是以数字开头时,此选项才有效
但是您可以使用cmd/c
进行第二次扩展,然后它也可以用于数字名称
cmd /c echo Wallpaper %%g is #!num! - Title: "%%!num!%%"
您可以使用另一个,如dbenham建议的,也可以使用
CALL
call echo Wallpaper %%g is #!num! - Title: "%%!num!%%"
调用
第二次扩展一行,但在该行的第二次重新分析中,只有百分比扩展(既不是延迟的,也不是FOR循环扩展)起作用
编辑:仅当num的内容不是以数字开头时,此选项才有效
但是您可以使用cmd/c
进行第二次扩展,然后它也可以用于数字名称
cmd /c echo Wallpaper %%g is #!num! - Title: "%%!num!%%"
除非它会失败,因为变量名是数字!显然,名称应该更改为包含字母前缀。是的,你是对的,我错过了这一点,但是你可以用
cmd/c
解决它,除非它会失败,因为变量名是数字!显然,名称应该更改为包含一个alpha前缀。是的,你是对的,我错过了,但是你可以用cmd/c
解决这个问题,谢谢你的建议和最后的代码,帮助很大,一切都非常清楚。注意:第一个setlocal disableDelayedExpansion
(s