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

2019-10-16 20:41发布

正如标题所说,我试图从一个文件夹回升至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存储这种方式,因为有时我可能需要短短三年壁纸,不必按数字顺序]

Answer 1:

转让!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!"
)


Answer 2:

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

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

CALL膨胀的线的第二时间,但只百分比膨胀,无论延迟也不FOR环膨胀的线的第二重分析的工作原理。

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

但是你可以使用cmd /c扩大第二次,那么它也可以用数字名称。

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


文章来源: Windows batch file - Pick (up to) four random files in a folder