Windows批处理文件 - 挑选(最多)一个文件夹中的四个随机文件
正如标题所说,我试图从文件夹中选取四个随机文件(壁纸)作进一步处理。该文件夹不包含子文件夹,只有* .jpg的,* .bmp的和* .png的(它可能包含一个Thumbs.db文件,但我已经照顾过了)可能。
我用for
循环读取所有文件,使其类似于数组,然后我想要运行另一个for
循环来制作随机数,它将充当选择文件的索引。
Windows批处理文件 - 挑选(最多)一个文件夹中的四个随机文件
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命令包括文件夹。您需要添加
/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!"
)
你可以使用另一种像dbenham建议,或者您可以使用CALL
call echo Wallpaper %%g is #!num! - Title: "%%!num!%%"
一个CALL
扩展线第二次,但只有百分比扩展,既没有延迟也没有FOR循环扩展在线的第二次重新分析中起作用。
编辑:这只适用于,如果num的内容不以数字开头。
但您可以使用cmd /c
再次展开,然后它也可以与数字名称一起使用。
cmd /c echo Wallpaper %%g is #!num! - Title: "%%!num!%%"
感谢您的建议,并最终代码,帮助了很多,一切都是水晶clear.One注:第一个'SETLOCAL disableDelayedExpansion'(第二行)可以省略,说得也对,我宁愿有?一个1开始的数组,作为我的文件管理器编号从1开始。第一个'for'循环然后读取'/ f“tokens = * delims =”%% g in('dir C:\ Dati \ Marco \ Documenti \/A:d/b')中做(! 集/一个IND + = 1个 SETLOCAL enableDelayedExpansion 为%%的N(IND)做( ENDLOCAL 组 “WP %% N = %%克” ) )'(注意设置ind和delayedexpansion的交换) – Marco