2017-03-24 25 views
0

パースペクティブ:このスクリプトは、ユーザーのログイン時およびデスクトップ上のショートカットで実行するコマンドで実行されます。アプリケーションの開始順序は必須です。スクリプト全体を通して、完全なパスとプログラム名が必要です。For EachのVBS多次元配列

問題:各プログラムパスは配列内の値です。私は各プログラムのパスを "\"で分割し、上限を取得してプログラム名を取得しようとしています。次に元の配列を保持し、2番目の次元にプログラムを追加します。何時間も読んだ後、私は最後の次元だけを変えることができると理解していますが、縛られていないエラーをどのようにして取り除かないのか分かりません。この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) 
+0

[多次元の作成の可能複製、 VBScriptでの連想配列](// stackoverflow.com/q/4588469) – Lankymart

答えて

1

どうpathesを構築/解析するFileSystemObjectオブジェクトを使用する方法と、2次元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 
+0

私たちのためにコードを説明するのはどうですか? – Lankymart

+0

Horner、私はあなたが私の意図を正しく理解したと思います。 最初にファイルパスをstrProgramListに置き換えて "a"に設定しました。 "type mismatch"というエラーが表示されました。次に、何が起こっているのかを知るためにstrProgramList(1)に変更しました。今回は、コードが実行されましたが、明らかに最初のプログラムだけですが、スペース上で分割されています。私はこのDim a:a = Split(strProgramList(1)、 "\")に変更しようとしましたが、うまくいきませんでした。 ありがとう – user2847926

+0

@ user2847926あなたの意図を正しく理解しているわけではなく、同様の問題を抱えている可能性のある人を助けるための十分な詳細な回答を提供することです。とにかく、この質問は明確な複製です。あなたのコードの微妙なニュアンスを修正するためではありません。 – Lankymart