【问题标题】:VBS multidimensional array from a For Each来自 For Each 的 VBS 多维数组
【发布时间】:2017-03-24 22:01:41
【问题描述】:

透视:此脚本将在用户登录和桌面上带有快捷方式的命令上运行。应用程序启动的顺序是必须的。在整个脚本中,我需要完整路径和程序名称。

问题:每个程序路径都是数组中的一个值。我试图用“\”分割每个程序路径,并获取程序名称的上限。然后 Redim 保留原始数组并在第二维上添加程序。阅读了几个小时后,我意识到我只能改变最后一个维度,但我不知道如何不超出界限错误。这个Creating a Multidimensional, Associative Array in VBScript 不是试图从 For Each 拆分中重新调整保留。

Set objFso = CreateObject("Scripting.FileSystemObject")

'---Create Program Variables
strProgram1 = "%SystemRoot%\notepad.exe" 
strProgram2 = "C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE" 
strProgram3 = "C:\Program Files\Microsoft Office\root\Office16\ONENOTE.EXE" 
strProgram4 = "C:\Program Files (x86)\Internet Explorer\iexplore.exe" & " https://www.google.com" 'IE with URL

'---Add Program Path Variables to an Array
ReDim strProgramList(3) 
strProgramList = Array(strProgram1,strProgram2,strProgram3,strProgram4)

strProgramNameList = Array()
strProgramRestartList = Array()
boolNeedsRestart = false

'---Iterating using For each loop to get program name. 
ReDim Preserve strProgramList(3, 1)
For Each strProgramPath In strProgramList
        strPathComponents = Split(strProgramPath, "\")
        strProgramName = strPathComponents(Ubound(strPathComponents))
        strProgramList(0, LBound(strProgramList) + 1) = strProgramName

Next

MsgBox strProgramList(0,0) & vbNewLine & strProgramList(1,0) & vbNewLine & strProgramList(2,0)  & vbNewLine & strProgramList(3,0) & vbNewLine & strProgramList(0,1) & vbNewLine & strProgramList(1,1) & vbNewLine & strProgramList(2,1) & vbNewLine & strProgramList(3,1)

【问题讨论】:

标签: multidimensional-array vbscript


【解决方案1】:

如何使用 FileSystemObject 解析/构建路径以及如何使用二维arrays

Option Explicit

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")
Dim a    : a        = Split("A:\B\CC.EXE A:\CC\DD.CMD C:\You\Got\It.pl")
ReDim b(2, UBound(a))
Dim i
For i = 0 To UBound(a)
   b(0, i) = a(i)
   b(1, i) = goFS.GetParentFolderName(a(i))
   b(2, i) = goFS.GetFileName(a(i))
Next
ReDim Preserve b(2, UBound(b, 2) + 1)
b(0, UBound(b, 2)) = "P:\i\pa\po.py"
b(1, UBound(b, 2)) = goFS.GetParentFolderName(b(0, UBound(b, 2)))
b(2, UBound(b, 2)) = goFS.GetFileName(b(0, UBound(b, 2)))
For i = 0 To UBound(b, 2)
   WScript.Echo b(0, i), "=", b(1, i), "+", b(2, i), "=>", goFS.BuildPath(b(1, i), b(2, i))
Next

输出:

cscript twodim.vbs
A:\B\CC.EXE = A:\B + CC.EXE => A:\B\CC.EXE
A:\CC\DD.CMD = A:\CC + DD.CMD => A:\CC\DD.CMD
C:\You\Got\It.pl = C:\You\Got + It.pl => C:\You\Got\It.pl
P:\i\pa\po.py = P:\i\pa + po.py => P:\i\pa\po.py

【讨论】:

  • 不如给我们这些小凡人解释一下代码怎么样?
  • 霍纳,我想你已经正确理解了我的意图。我最初用我的 strProgramList 替换了您的文件路径,以将其设置为“a”。我收到错误“类型不匹配”。然后我将其更改为 strProgramList(1) 只是为了看看我是否知道发生了什么。这次你的代码运行了,显然只有第一个程序,但是它在空间上分裂。我尝试将其更改为 Dim a : a = Split(strProgramList(1), "\") 但这不起作用。谢谢
  • @user2847926 这不是正确理解您的意图的情况,而是提供足够详细的答案以帮助可能遇到类似问题的其他人。无论如何,这个问题显然是重复的,我们不是在这里修复代码的细微差别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
相关资源
最近更新 更多