一个复杂的VBS脚本问题——变量的变量

标签: , , , , ,

如果说之前写的《一个简单的VBS脚本问题——两数相加》没有什么技术含量,那么这个问题就相对比较有技术含量了。一个很久以前别人问的问题:

话说。。有a1、a2、a3…..a100这100个变量,不是数组,有没办法快速把他们加起来。。。
for i=1 to 100 step 1
a=a+a & i
next
我试了不行。。

自己先思考一下怎么做吧,我已经把这100个变量准备好了,点击这里获取。随机生成了100个[1,100]之间的数,所有数的和为5076,看看你算对了吗?

看到这个问题,我最先想到的是PHP,用变量的变量很容易实现:

<?php
/*************************
Author: Demon
Website: https://demon.tw
E-mail: 380401911@qq.com
*************************/
//此处省略100个变量
for($i = 1; $i <= 100; $i++)
{
    $sum = $sum + ${"a$i"};
}
echo $sum;
?>

但是别人问的是VBS,而不是PHP。按照他给出的代码,他也是想用变量的变量来实现,只可惜VBS中没有这种特性。

这个问题我当时想了好久,似乎也只能一个一个变量的加了,于是告诉他,这在VBS中无法实现。但是今天却无意中想到了实现的方法:

'Author: Demon
'Website: https://demon.tw
'E-mail: 380401911@qq.com
'此处省略100个变量
For i = 1 To 100
    str = str & "a" & i & "+"
Next
str = Left(str, Len(str) - 1)
WScript.Echo Eval(str)

使用Eval可以用字符串动态构造出代码,在很多VBS病毒里都能看到Eval的影子,我当时怎么就没想到Eval呢?看来真的是不写病毒好多年。

赞赏

微信赞赏支付宝赞赏

随机文章:

  1. VBS ByRef和ByVal参数
  2. 用VBS写的VBS代码格式化工具VbsBeautifier
  3. 一个VBS恶作剧程序的解密
  4. 在C语言程序中使用cURL库(libcurl)
  5. _get_osfhandle函数

11 条评论 发表在“一个复杂的VBS脚本问题——变量的变量”上

  1. PopEye说道:

    看到这题目的第一反应就是使用eval,但是自己没有真正写过eval的代码。今天学习了。“Talk is cheap,show me the code.” 这是真理。

  2. PopEye说道:

    我不会PHP,所以只能反应eval了,嘿嘿。按照你的思路另写了一个VBS,可以自动产生100个随机数,分别以数组方式和Eva方式计算求和。
    Option Explicit
    Dim arrS(99),I,str,intSum1,intSum2
    For I = 0 To 99
    Randomize
    arrS(I) = Int(100 * Rnd + 1)
    Execute(“A” & I & “= arrS(” & I & “)”)
    str = str & Eval(“A” & I) & ” “
    intSum1 = intSum1 + arrS(I)
    intSum2 = intSum2 + Eval(“A” & I)
    Next
    MsgBox str,64,”100个随机数”
    MsgBox intSum1 & vbTab & intSum2,64,”100个随机数求和”

  3. azziporah说道:

    以前搞Batch的时候也遇到过这个问题
    似乎脚本型的语言都有解决办法

    • Demon说道:

      不知BAT如何实现?能否分享一下代码?

      • azziporah说道:

        @echo off
        set FILE_NAME=100.txt
        setlocal EnableDelayedExpansion

        for /f “tokens=1,3” %%i in (%FILE_NAME%) do set %%i=%%j
        for /l %%i in (1,1,100) do set /a amt+=!a%%i!
        echo %amt%
        pause >nul

        REM Batch在每行代码执行前,会对名字进行“扩展“(expansion)
        REM 因而实现这个很方便

  4. 乱码说道:

    ‘此处省略100个变量
    For i = 1 To 100
    sum = Eval(sum & “+a” & i)
    Next
    WScript.Echo sum

    没有Demon大哥,我都不知道VBS有Eval
    才疏学浅真实惭愧…

  5. LinyiSChen说道:

    其实我的第一反应是Execute,
    ‘此处省略100个变量.
    For i=1 To 100
    Execute “sum=sum+a” & i
    Next
    MsgBox sum

  6. Libc说道:

    Hello demon,我在用VBS读写word时,用到很多的系统常量,在VBA中为枚举常量,如wdExportFormatPDF( ActiveDocument.ExportAsFixedFormat OutputFileName:= _
    “D:\Report\Actor Framework Whitepaper.pdf”, ExportFormat:= _
    wdExportFormatPDF, OpenAfterExport:=True, OptimizeFor:= _
    wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
    Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
    CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
    BitmapMissingFonts:=True, UseISO19005_1:=False
    ChangeFileOpenDirectory “D:\Report\”)
    在VBS中该怎么样才能获得到这些枚举常量的取值呢

LinyiSChen 留下回复