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 мая), пожалуйста? Мой скрипт работает, но все исполняемые файлы запускаются одновременно, а не с желаемой задержкой. Большое спасибо за помощь - person odelh; 29.05.2013
comment
Привет, Ансгар Вихерс![Иду дальше, даже если не все идеально... С одной стороны]....(ответил 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
Привет, Эккехард.Хорнер! Во-первых, почему бы мне не использовать такое имя? Тогда, как назвать мою подпрограмму с помощью текста переменной? Спасибо. - person odelh; 22.05.2013
comment
@odelh Имена должны быть значимыми, var1 и т. д. - нет. Если вы хотите вызвать функцию по имени, предоставленному во время выполнения, используйте GetRef(), как показано здесь: stackoverflow.com/a/ 13127606/603855 - person Ekkehard.Horner; 22.05.2013
comment
Я переписал свой код ... Он работает лучше, но со многими ошибками. Но мне нужно ждать 8 часов, чтобы опубликовать его, потому что он слишком длинный для публикации в комментариях. Кстати, я посмотрел на вашу ссылку, и это поможет мне во многих случаи. - person odelh; 22.05.2013