1

正如标题所说,我正在尝试从一个文件夹中选择最多四个随机文件(壁纸),以进行进一步处理。该文件夹不包含子文件夹,只有 *.jpg's、*.bmp's 和 *.png's(它可能包含 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这样存储,因为有时我可能只需要三张壁纸,而不是必须按数字顺序]

4

2 回答 2

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!"
)
于 2012-06-11T10:40:57.347 回答
0

您可以使用另一个 FOR 像 dbenham 建议的那样,或者您可以使用CALL

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

ACALL第二次扩展一行,但只有百分比扩展,既不延迟也不 FOR 循环扩展在该行的第二次重新解析中起作用。

编辑:这仅适用于 num 的内容不以数字开头的情况。

但是您可以使用cmd /c第二次扩展,然后它也适用于数字名称。

cmd /c echo Wallpaper %%g is #!num! - Title: "%%!num!%%"
于 2012-06-11T10:57:24.387 回答