标题: 一个复杂的VBS脚本问题——变量的变量
作者: Demon
链接: https://demon.tw/programming/vbs-variable-variables.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。
如果说之前写的《一个简单的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呢?看来真的是不写病毒好多年。
赞赏微信赞赏支付宝赞赏
随机文章:
看到这题目的第一反应就是使用eval,但是自己没有真正写过eval的代码。今天学习了。“Talk is cheap,show me the code.” 这是真理。
为啥我第一反应是PHP。。。
我不会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个随机数求和”
程序很不错,也只有你才会在回复中留下代码。
以前搞Batch的时候也遇到过这个问题
似乎脚本型的语言都有解决办法
不知BAT如何实现?能否分享一下代码?
@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 因而实现这个很方便
不懂批处理,学习了。
‘此处省略100个变量
For i = 1 To 100
sum = Eval(sum & “+a” & i)
Next
WScript.Echo sum
没有Demon大哥,我都不知道VBS有Eval
才疏学浅真实惭愧…
其实我的第一反应是Execute,
‘此处省略100个变量.
For i=1 To 100
Execute “sum=sum+a” & i
Next
MsgBox sum
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中该怎么样才能获得到这些枚举常量的取值呢