Windows批处理文件 - 选择(最多)文件夹中的四个随机文件

时间:2012-06-11 10:09:19

标签: 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 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以这种方式存储,因为有时我只需要三个壁纸,不一定按数字顺序排列]

2 个答案:

答案 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!%%"