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!" 
) 
+0

感谢您的建议,并最终代码,帮助了很多,一切都是水晶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

你可以使用另一种像dbenham建议,或者您可以使用CALL

call echo Wallpaper %%g is #!num! - Title: "%%!num!%%" 

一个CALL扩展线第二次,但只有百分比扩展,既没有延迟也没有FOR循环扩展在线的第二次重新分析中起作用。

编辑:这只适用于,如果num的内容不以数字开头。

但您可以使用cmd /c再次展开,然后它也可以与数字名称一起使用。

cmd /c echo Wallpaper %%g is #!num! - Title: "%%!num!%%" 
+1

Exc ept它会失败,因为变量名是数字的!显然,这些名称应该改为包含一个字母前缀。 – dbenham

+0

是的你是对的,我错过了,但你可以用'cmd/c'解决它,然后 – jeb