vbs с помощта на конфигурационен файл за стартиране на exe

Аз съм начинаещ във vbs и се опитвам да направя скрипт, стартиращ exe или услуги с определено забавяне между всеки един, смесих го в hta файл и работи добре. Но трябва да го използвам на много компютри и след това трябва да направя този скрипт по-лесен за конфигуриране и реших да добавя конфигурационен файл .csv. Но не успявам да накарам скрипта си да чете всички редове на моя csv един след друг.

Моят скрипт работи:

<!-- ----- ExeScript Options Begin -----  ScriptType: window,invoker  DestDirectory: temp  Icon:
     C:\Users\stream\Desktop\startapp.bmp  File:
     C:\Users\stream\Desktop\startapp.bmp  OutputFile:
     C:\Users\stream\Desktop\test.exe  ----- ExeScript Options End -----
     -->

    <head>
    <title>Start App</title>

    <HTA:APPLICATION
      APPLICATIONNAME="Start App"
      ID="startapp"
      VERSION="1.3"
      MAXIMIZEBUTTON="no"
      ICON="startapp.ico"
      SINGLEINSTANCE="yes"
      SELECTION="no"/>

    <SCRIPT TYPE="text/javascript">
    window.resizeTo(350,275);
    window.moveTo(2,720);
    </SCRIPT>

    <SCRIPT language="vbscript">
    Dim WshShell

    Sub Window_onLoad
        StartTimer      
    End Sub

    Sub StartTimer
        MonTimer0 =window.setTimeOut ("welcome", 5000, "VBScript") 'Appel de MonScript
        MonTimer1 = window.setTimeOut ("Start01", 35000, "VBScript") 'Appel de MonScript 
        MonTimer2 = window.setTimeOut ("Start02", 45000, "VBScript") 'Appel de MonScript 
        MonTimer8 = window.setTimeOut ("Startend", 55000, "VBScript") 'Appel de MonScript 
        MonTimer9 = window.setTimeOut ("Startclose", 65000, "VBScript") 'Appel de MonScript 
    End sub

    Sub Welcome
    S = SetTimeOut("MaSub (""Vos applications vont se lancer dans un instant... Veuillez patienter..."")", 100)
    End Sub     

    Sub Start01
    Set WshShell = CreateObject ("Wscript.Shell")
    WshShell.Run """C:\Program Files\soft1\soft1.exe"""
    S = SetTimeOut("MaSub (""soft1 a bien été lancé !"")", 100)
    End Sub

    Sub Start02
    Set WshShell = CreateObject ("Wscript.Shell")
    WshShell.Run """C:\Program Files\soft2\soft2.exe"""
    S = SetTimeOut("MaSub (""Soft2 a bien été lancé !"")", 100)
    End Sub

    Sub Startend
    S = SetTimeOut("MaSub (""Toutes les applications ont été correctement lancées ! StartApp va se fermer..."")", 100)
    End Sub

    Sub Startclose
    window.close()
    End Sub

    Set WshShell = nothing

    </SCRIPT>

    </head>

    <Body STYLE="font:10 pt arial; color:white;filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=1, StartColorStr='#000033', EndColorStr='#0000FF')">

    <p><center> <img src=".\startapp.bmp" /> </center></p>
    <br/><br/><br/>

    <p><center>
    <span style="color:white">
    <div id = D></div>

    <script language = vbs>
    Sub MaSub (E)
    Document.All.D.innerHTML = E
    ClearTimeOut S
    End Sub
    </script>
    </center></p>

    </span>
    </body>
    </html>

Сега кодът, който се опитвам да направя... csv файл:

    MonTimer0;Start01;5000;"C:\Program Files\soft1\soft1.exe";soft1 a bien été lancé !
    MonTimer1;Start02;10000;"C:\Program Files\soft1\soft2.exe";soft2 a bien été lancé !;

hta файл:

    <!-- ----- ExeScript Options Begin -----
     ScriptType: window,invoker
     DestDirectory: temp
     Icon: D:\Bureau\startapp.bmp
     File: D:\Bureau\startapp.bmp
     OutputFile: D:\Bureau\test.exe
     ----- ExeScript Options End ----- -->

    <head>
    <title>Start App</title>

    <HTA:APPLICATION
      APPLICATIONNAME="Start App"
      ID="startapp"
      VERSION="1.2"
      MAXIMIZEBUTTON="no"
      ICON="startapp.ico"
      SCROLL="no"
      SINGLEINSTANCE="yes"
      SELECTION="no"/>

    <SCRIPT TYPE="text/javascript">
    window.resizeTo(350,275);
    window.moveTo(10,10);
    </SCRIPT>

    <SCRIPT language="vbscript">
      Dim FSO, LeFichier
                Dim CheminNomFichier, MeTbl, PourTbl, T


    Set fso = CreateObject("Scripting.FileSystemObject")
    CheminNomFichier =  "D:\Mes documents\PROGRAMMATION\Startapp\StartApp.csv"
    Set LeFichier = fso.OpenTextFile(CheminNomFichier,1)

    PourTbl = LeFichier.ReadAll

    LeFichier.Close

       Dim Var0, Var1, Var2, Var3, Var4
    ' .......................
    'PourTbl contient: "un;deux;trois;quatres;cinqiéme et dernier;"
        MeTbl = split(PourTbl,";")
        for T =0 to ubound(MeTbl)-1

        next
        var0 = MeTbl(0)
        var1 = MeTbl(1)
        var2 = MeTbl(2)
        var3 = MeTbl(3)
var4 = MeTbl(4)

    Dim WshShell

            Sub Window_onLoad
                StartTimer      
            End Sub

    Sub StartTimer
                var0 =window.setTimeOut ( var1 , var2, "VBScript") 'Appel de MonScript
            End sub

    Sub var1

    Set WshShell = CreateObject ("Wscript.Shell")
    WshShell.Run WshShell.ExpandEnvironmentStrings(var3)

    S = SetTimeOut("MaSub (var4)", 100)
    End Sub

    Sub Startend
    S = SetTimeOut("MaSub (""toutes les applications ont été correctement lancées !"")", 100)
    End Sub

    Sub Startend
    window.close()
    End Sub

    Set WshShell = nothing 
    </SCRIPT>

    </head>

    <Body STYLE="font:10 pt arial; color:white;filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=1, StartColorStr='#000033', EndColorStr='#0000FF')">

    <p><center> <img src=".\startapp.bmp" /> </center></p>
    <br/><br/><br/>

    <p><center>
    <span style="color:white">
    <div id = D></div>

    <script language = vbs>
    Sub MaSub (E)
    Document.All.D.innerHTML = E
    ClearTimeOut S
    End Sub
    </script>
    </center></p>

    </span>
    </body>
    </html>

стартирайки hta, той ми казва синтактична грешка на ред 68 [ sub (var1) ] и не прави нищо...

Ако можете да ми помогнете, ще бъде много любезно! nb: Съжалявам, ако английският ми е малко лош, отдавна не съм използвал този език.


person odelh    schedule 22.05.2013    source източник


Отговори (2)


Set LeFichier = fso.OpenTextFile(CheminNomFichier,1)
PourTbl = LeFichier.ReadAll
LeFichier.Close
...
MeTbl = split(PourTbl,";")

Горното най-вероятно е причината за вашия проблем, че HTA изглежда не чете всички редове. Ако прочетете целия CSV наведнъж (ReadAll), вие трябва да разделите текста на редове, преди да разделите всеки ред на отделни полета:

Set LeFichier = fso.OpenTextFile(CheminNomFichier,1)
PourTbl = LeFichier.ReadAll
LeFichier.Close
...
For Each line In Split(PourTbl, vbNewLine)
  MeTbl = split(PourTbl,";")
  var0 = MeTbl(0)
  ...
Next

В противен случай трябва да прочетете файла ред по ред:

Set LeFichier = fso.OpenTextFile(CheminNomFichier,1)
...
Do Until LeFichier.AtEndOfStream
  PourTbl = LeFichier.ReadLine
  MeTbl = split(PourTbl,";")
  var0 = MeTbl(0)
  ...
Next
LeFichier.Close

Така или иначе, трябва да обработите редовете на файла в цикъл.

Друг проблем е, че цикълът, който имате във вашия код

MeTbl = split(PourTbl,";")
for T =0 to ubound(MeTbl)-1

next
var0 = MeTbl(0)
var1 = MeTbl(1)
...

всъщност не прави нищо. Разделяте съдържанието на CSV, след това увеличавате T до UBound(MeTbl)-1, без да правите нищо друго, след което присвоявате първите 5 стойности (т.е. стойностите от първия ред на CSV) на променливи.

person Ansgar Wiechers    schedule 22.05.2013
comment
Не трябва ли For Each line In Split(PourTbl) да е For Each line In Split(PourTbl, vbCrLf)? - person Ekkehard.Horner; 23.05.2013
comment
Предпочитам vbNewLine, но да. Фиксирана. - person Ansgar Wiechers; 23.05.2013
comment
Благодаря, съгласен съм с vbNewLine. - person Ekkehard.Horner; 23.05.2013
comment
Благодаря ви за вниманието. - person Ansgar Wiechers; 23.05.2013
comment
Здравейте! Бихте ли могли да погледнете последния ми код (24 май), моля? Скриптът ми работи, но всички exe файлове се стартират едновременно, вместо да стартират с желаното забавяне. Благодаря много за помощта - person odelh; 29.05.2013
comment
Здравей Ansgar Wiechers! [Продължавам, дори и всичко да не е идеално... От една страна].... (отговорено на 24 май в 12:35) всичко върви, но в неподходящ момент... всички exe се стартират едновременно и закъсненията и текстовете се показват след това - person odelh; 30.05.2013
comment
@odelh Вашият отговор от 24 май беше изтрит от модератор. Това означава, че вече не се вижда от всеки, който няма достъп до инструментите за модериране. Защо не го пуснахте като нов въпрос, както ви зададох? - person Ansgar Wiechers; 31.05.2013
comment
О, добре. Извиних се, не бях разбрал така, защото по пътя все още мога да видя отговора си. След това ще създам нов въпрос. Благодаря - person odelh; 03.06.2013

Не можете да имате променлива и под с име var1. (И на първо място не трябва да използвате такива гадни имена.)

person Ekkehard.Horner    schedule 22.05.2013
comment
Здравей Ekkehard.Horner !Първо, защо не трябва да използвам този вид име? След това, какъв е начинът да наименувам своя суб с текста на променливата?Благодаря - person odelh; 22.05.2013
comment
@odelh Имената трябва да имат смисъл, var1 и т.н. не са. Ако искате да извикате функция с име, предоставено по време на изпълнение, използвайте GetRef(), както е показано тук: stackoverflow.com/a/ 13127606/603855 - person Ekkehard.Horner; 22.05.2013
comment
Написах отново кода си... Работи по-добре, но с много грешки. Но трябва да чакам 8 часа, за да го публикувам, защото е твърде дълго за публикуване в коментари. btw Погледнах връзката ви и ще ми помогне в много случаи. - person odelh; 22.05.2013