VBScript调用外部脚本文件时如何修改变量值并回传至原脚本
VBS跨独立脚本文件传参并回传修改值的实现方案
你当前通过WScript.Shell.Run启动外部VBS脚本时,调用脚本和被调用脚本属于完全独立的两个进程,命令行参数为值传递模式,被调用脚本中修改的只是自身进程内存里的变量副本,无法直接改写调用方进程内的变量,因此最终弹窗只会显示初始值"foo"。
以下是三种可落地的实现方案:
方案1:标准输出回传 + Exec方法捕获结果
这是最轻量的无文件方案,不需要额外写磁盘或者修改系统配置,被调用脚本将处理完成的值输出到标准输出流,调用方通过Exec方法替代Run启动脚本,即可直接读取返回结果。
1.vbs 代码
Dim MyVar, shell, execObj, result MyVar = "foo" Set shell = CreateObject("WScript.Shell") ' 显式指定cscript作为脚本宿主,保证StdOut可用 Set execObj = shell.Exec("cscript.exe //nologo ""C:\2.vbs"" """ & MyVar & """") ' 等待被调用脚本执行完成 Do While execObj.Status = 0 WScript.Sleep 10 Loop ' 读取输出结果,去除首尾空白换行 result = Trim(execObj.StdOut.ReadAll()) MyVar = result MsgBox MyVar ' 最终输出修改后的"bar"
2.vbs 代码
If WScript.Arguments.Count > 0 Then Call MySub(WScript.Arguments(0)) End If Sub MySub(MyVar) MyVar = "bar" ' 将处理结果写入标准输出流 WScript.StdOut.WriteLine MyVar End Sub
注意:该方案必须通过
cscript.exe启动被调用脚本,wscript.exe宿主下StdOut对象不可用,会触发运行时错误。
方案2:临时文件传值
如果不想依赖cscript宿主,可以通过约定路径的临时文件中转回传值,两个脚本按照约定读写同一个临时文件即可。
1.vbs 代码
Dim MyVar, fso, tempFile, shell ' 约定临时文件存储路径 Const tempPath = "C:\vbs_temp_val.txt" MyVar = "foo" Set shell = CreateObject("WScript.Shell") Set fso = CreateObject("Scripting.FileSystemObject") ' 启动被调用脚本,传入初始值和临时文件路径 shell.Run """C:\2.vbs"" """ & MyVar & """ """ & tempPath & """", 1, True ' 脚本执行完成后读取临时文件中的回传值 Set tempFile = fso.OpenTextFile(tempPath, 1) MyVar = tempFile.ReadAll() tempFile.Close ' 用完删除临时文件避免残留 fso.DeleteFile tempPath, True MsgBox MyVar
2.vbs 代码
Dim fso, outFile If WScript.Arguments.Count > 1 Then Call MySub(WScript.Arguments(0), WScript.Arguments(1)) End If Sub MySub(MyVar, tempPath) MyVar = "bar" ' 将修改后的值写入约定的临时文件 Set fso = CreateObject("Scripting.FileSystemObject") Set outFile = fso.CreateTextFile(tempPath, True) outFile.Write MyVar outFile.Close End Sub
注意:多脚本实例同时运行时会出现临时文件读写冲突,可通过给临时文件名追加进程ID、随机字符串的方式生成唯一路径,避免冲突。
方案3:用户环境变量传值
利用当前用户的环境变量作为中转存储,两个脚本都可以读写自定义的用户环境变量,实现值的双向传递。
1.vbs 代码
Dim MyVar, shell, userEnv MyVar = "foo" Set shell = CreateObject("WScript.Shell") ' 取用户级环境变量集合 Set userEnv = shell.Environment("USER") ' 先把初始值写入自定义环境变量 userEnv("VBS_CUSTOM_PASS_VAL") = MyVar ' 启动被调用脚本 shell.Run """C:\2.vbs""", 1, True ' 读回修改后的变量值 MyVar = userEnv("VBS_CUSTOM_PASS_VAL") ' 用完删除自定义环境变量避免残留 userEnv.Remove "VBS_CUSTOM_PASS_VAL" MsgBox MyVar
2.vbs 代码
Dim shell, userEnv, MyVar Set shell = CreateObject("WScript.Shell") Set userEnv = shell.Environment("USER") ' 读取传入的初始值 MyVar = userEnv("VBS_CUSTOM_PASS_VAL") ' 修改变量 MyVar = "bar" ' 将修改后的值写回环境变量 userEnv("VBS_CUSTOM_PASS_VAL") = MyVar
注意:用户级环境变量对当前用户下所有进程可见,自定义变量名不要和系统已有环境变量重名,多实例场景同样需要做唯一标识避免值覆盖。
内容的提问来源于stack exchange,提问作者Victor Novak
相关产品推荐
相关产品推荐

