正如标题所说,我试图从一个文件夹回升至4个随机文件(墙纸),以便进一步处理。 该文件夹不包含子文件夹,只是* .JPG的,* .BMP的和*巴纽的(它可能包含的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
存储这种方式,因为有时我可能需要短短三年壁纸,不必按数字顺序]
转让!NUM! 值到一个FOR可变:-)
for %%N in (!num!) do echo Wallpaper %%g is #%%N - Title: "!%%N!"
一些其他建议:
由于写的,你的DIR命令是包括文件夹。 您需要添加/AD
选项
dir C:\Wallpapers /a:-hsd /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!"
)
你可以使用另一种像dbenham建议或者你可以使用CALL
call echo Wallpaper %%g is #!num! - Title: "%%!num!%%"
甲CALL
膨胀的线的第二时间,但只百分比膨胀,无论延迟也不FOR环膨胀的线的第二重分析的工作原理。
编辑:这仅适用,如果num的内容不以数字开头。
但是你可以使用cmd /c
扩大第二次,那么它也可以用数字名称。
cmd /c echo Wallpaper %%g is #!num! - Title: "%%!num!%%"