Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random Windows批处理文件-在一个文件夹中拾取(最多)四个随机文件_Random_Batch File_For Loop_Variable Expansion_Delayedvariableexpansion - Fatal编程技术网

Random Windows批处理文件-在一个文件夹中拾取(最多)四个随机文件

Random Windows批处理文件-在一个文件夹中拾取(最多)四个随机文件,random,batch-file,for-loop,variable-expansion,delayedvariableexpansion,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 i

正如标题所说,我试图从一个文件夹中随机选取四个文件(壁纸),以便进一步处理。该文件夹不包含子文件夹,仅包含*.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!!"
)

当然,只输出
墙纸1的行是#118-Title:“118”
而不是
墙纸1是#118-Title:“C:\wallps\Miami Skyline.jpg”


因此,我的具体问题是:如何在
循环中对
变量进行双重展开?

[注意#1:创建随机数的行需要如此长,因为它提供了良好的值随机分布]

[注意#2:我需要
wps
以这种方式存储,因为有时我可能只需要三张壁纸,不一定是数字顺序]

传输!号码!变量的值:-)

另外还有几个要点:

  • 如前所述,DIR命令包含文件夹。您需要添加
    /A-D
    选项

    dirc:\wallpaps/a:-h-s-d/b/s

  • 数字变量名在现有代码中工作。但是,如果您尝试使用普通扩展来访问它们,您将遇到一些问题,因为
    %1%
    将扩展为第一批参数,而不是环境变量。一般情况下,应避免以数字开头环境变量。您可以使用:

    设置wp!ind!=%%g


    echo壁纸%%g是#!num!-标题:“!wp%%N!

  • 通过增加循环底部而不是顶部的计数器,可以使数组基于0。这样,就不需要向随机数中添加一个计数器。(这个技巧很简单。更多的是风格问题。)

  • 您不需要同时使用
    “tokens=*”
    “delims=“
    ”。我建议使用后者。
    “delims=“
    将保留整个字符串。
    tokens=*
    将在删除前导空格和制表符后保留整个字符串。文件名可以以空格开头

  • 如果任何文件名包含
    字符,您的代码将失败。在扩展
    %%g
    时,感叹号将由于延迟扩展而损坏。通过打开延迟扩展和of并使用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!"
)

将!num!值传递给FOR变量:-)

另外还有几个要点:

  • 如前所述,您的DIR命令包含文件夹。您需要添加
    /A-D
    选项

    dirc:\wallpaps/a:-h-s-d/b/s

  • 数值变量名在现有代码中有效。但如果您尝试使用正常扩展访问它们,则会出现不匹配,因为
    %1%
    将扩展为第一批参数,而不是环境变量。通常情况下,应避免以数字开头环境变量。您可以使用:

    设置wp!ind!=%%g


    echo壁纸%%g是#!num!-标题:“!wp%%N

  • 通过增加循环底部而不是顶部的计数器,可以使数组基于0。那么你不需要在你的随机数上加一个。(这个技巧很琐碎,更多的是风格问题。)

  • 您不需要同时使用
    “tokens=*”
    “delims=“
    ”。我推荐后者
    “delims=“
    将保留整个字符串
    tokens=*
    在去掉前导空格和制表符后,将保留整个字符串。文件名可以以空格开头

  • 如果任何文件名包含
    ,代码将失败字符。由于扩展延迟,在扩展
    %%g
    期间感叹号将被损坏。通过切换延迟扩展的on和of,并使用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!%%"
调用
第二次扩展一行,但在该行的第二次重新分析中,只有百分比扩展(既不是延迟的,也不是FOR循环扩展)起作用

编辑:仅当num的内容不是以数字开头时,此选项才有效

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

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

您可以使用另一个,如dbenham建议的,也可以使用
CALL

call echo Wallpaper %%g is #!num! - Title: "%%!num!%%"
调用
第二次扩展一行,但在该行的第二次重新分析中,只有百分比扩展(既不是延迟的,也不是FOR循环扩展)起作用

编辑:仅当num的内容不是以数字开头时,此选项才有效

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

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

除非它会失败,因为变量名是数字!显然,名称应该更改为包含字母前缀。是的,你是对的,我错过了这一点,但是你可以用
cmd/c
解决它,除非它会失败,因为变量名是数字!显然,名称应该更改为包含一个alpha前缀。是的,你是对的,我错过了,但是你可以用
cmd/c
解决这个问题,谢谢你的建议和最后的代码,帮助很大,一切都非常清楚。注意:第一个
setlocal disableDelayedExpansion
(s