Vbs завершение сценария

VBS: Метод выхода/завершение скрипта (Страница 1) — Windows Script Host, HTA (VBScript, JScript) — Общение — Серый форум — разработка скриптов

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

1 2013-01-22 17:06:33 (изменено: Dr.Hofmann, 2013-01-22 17:08:44)

  • Dr.Hofmann
  • Участник
  • Неактивен
  • Рейтинг : [0|0]

Тема: VBS: Метод выхода/завершение скрипта

Всем привет!
Хочу дописать скрит vbs — котрый будет  выполнять следующие действия:
По ходу просмотра будет вопрос:

LogFile=".cat1.*."
If objFSO.FileExist(LogFile) Then

Set objFSO = CreateObject("Scripting.FileSystemObject") - Инициализирую переменную путем создания объекта файловой системы    

If objFSO.FileExist(LogFile) Then

        objFSO.CopyFile ".cat1*.*" , ".arch" - вызываю метод для копирование в архив тех файлов которые попадают в этот каталог
        
    
        objFSO.MoveFile ".cat1*.*" , ".cat2" - перемещаю в нужный каталог 

 Else

                                Exit(); close. copy-moving.vbs    -  1.  [b]Хотелось бы сдесь реализовать выход, завершение?[/b]
                  ЗДЕСЬ
{

2. Так же реализовать условие которое которое проверяло бы - логически выполненную строку например:

 IF (objFSO.MoveFile ".cat1*.*" , ".cat2") = true then

WScript.CreateObject("Wscript.Shell").Run "netsend.bat", 1, vbTrue

Else 

WScript.CreateObject("Wscript.Shell").Run "netsend2.bat", 1, vbTrue


}

[b]Что можете посоветовать?[/b]

'сообщаем о результатах копирования
If Err.Number Then
WScript.CreateObject("Wscript.Shell").Run "netsend.bat", 1, vbTrue

else
WScript.CreateObject("Wscript.Shell").Run "netsend2.bat", 1, vbTrue

Err.Clear
End if

2 Ответ от Rom5 2013-01-22 19:31:04 (изменено: Rom5, 2013-01-22 19:35:12)

  • Rom5
  • Участник
  • Неактивен
  • Рейтинг : [1|0]

Re: VBS: Метод выхода/завершение скрипта

Объект WshShell — Метод 3.4. Run

Там есть пример запуска (например, Вашего батника) с ожиданием завершения работы и выводом возвращаемого кода.

а также — 4.2.1. ExitCode

Устанавливать на выходе из скрипта свой код возврата — Объект WScript — 3.2. Quit

WBR. Roman

3 Ответ от Dr.Hofmann 2013-01-23 10:03:16

  • Dr.Hofmann
  • Участник
  • Неактивен
  • Рейтинг : [0|0]

Re: VBS: Метод выхода/завершение скрипта

LogFile = ".cat1*.*"
Const OverwriteExisting = True   
Set objFSO = CreateObject("Scripting.FileSystemObject")     
     
If objFSO.FileExists(LogFile) Then 
objFSO.CopyFile ".cat1*.*" , ".arch" , OverwriteExisting                                 
objFSO.MoveFile ".cat1*.*" , ".cat2" 
Else                           
WScript.Quit 1
End If

Выполняется но ничего не делает, вопрос к знатокам где ошибка?

4 Ответ от Rom5 2013-01-23 11:00:02

  • Rom5
  • Участник
  • Неактивен
  • Рейтинг : [1|0]

Re: VBS: Метод выхода/завершение скрипта

FSO-методы  .Copy и .Move по моему не поддерживают символы подстановки (*, ?), т.е. это только для явно указанного файла.

Для работы с маской можете вызывать внешний cmd.exe с командой копирования (или вызов батник, принимающий параметры — что и куда копировать):

WScript.CreateObject("WScript.Shell").Run "%COMSPEC% /c Copy <source> <dest>"

WBR. Roman

5 Ответ от Dr.Hofmann 2013-01-23 15:21:57 (изменено: Dr.Hofmann, 2013-01-23 15:22:55)

  • Dr.Hofmann
  • Участник
  • Неактивен
  • Рейтинг : [0|0]

Re: VBS: Метод выхода/завершение скрипта

Возникает вопрос а зачем его запускать если в каталоге нет файлов?

С помощъю чего можно реализовать проверку наличия каких либо файлов в каталоге? — на первом этапе а потом уже производить копирование или перемещение.

6 Ответ от alexii 2013-01-23 16:51:21

  • alexii
  • Разработчик
  • Неактивен

Re: VBS: Метод выхода/завершение скрипта

FSO-методы  .Copy и .Move по моему не поддерживают символы подстановки (*, ?), т.е. это только для явно указанного файла.

Поддерживают.

В отличие от «.FileExists()». Посему здесь:

LogFile = «.cat1*.*»

If objFSO.FileExists(LogFile) Then

— ошибка.

С помощъю чего можно реализовать проверку наличия каких либо файлов в каталоге?

VBS проверка существования файла по маске

7 Ответ от Rom5 2013-01-23 16:56:33 (изменено: Rom5, 2013-01-23 17:00:03)

  • Rom5
  • Участник
  • Неактивен
  • Рейтинг : [1|0]

Re: VBS: Метод выхода/завершение скрипта

Dr.Hofmann пишет:

Возникает вопрос а зачем его запускать если в каталоге нет файлов?

С помощъю чего можно реализовать проверку наличия каких либо файлов в каталоге? — на первом этапе а потом уже производить копирование или перемещение.

Если известно имя конкретного файла, то там же на «Главной», где про объекты WScript, есть и про объект «FileSystemObject» и там есть про метод «FileExists».

WBR. Roman

8 Ответ от Dr.Hofmann 2013-01-23 19:15:27

  • Dr.Hofmann
  • Участник
  • Неактивен
  • Рейтинг : [0|0]

Re: VBS: Метод выхода/завершение скрипта

Если известно имя конкретного файла, то там же на «Главной», где про объекты WScript, есть и про объект «FileSystemObject» и там есть про метод «FileExists».

Я же написал каких-либо файлов —  имя его неизвестно.

VBS проверка существования файла по маске

полезными оказались две строчки

использовать иной инструмент: WMI-подписку на соответствующее системное событие.
Ищите на форуме темы по ключам CIM_DirectoryContainsFile и __InstanceCreationEvent.

9 Ответ от alexii 2013-01-23 20:20:11

  • alexii
  • Разработчик
  • Неактивен

Re: VBS: Метод выхода/завершение скрипта

Dr.Hofmann, для проверки наличия файлов достаточно Folder.Files.Count > 0 безо всяких подписок.

10 Ответ от Dr.Hofmann 2013-01-24 13:46:02

  • Dr.Hofmann
  • Участник
  • Неактивен
  • Рейтинг : [0|0]

Re: VBS: Метод выхода/завершение скрипта

Dr.Hofmann, для проверки наличия файлов достаточно Folder.Files.Count > 0 безо всяких подписок.

пасиб — получилось

Вот как сделал:

run_copy.vbs

LogFile = ".cat1" 
Set objFSO = CreateObject("Scripting.FileSystemObject")   
Set Folder = objFSO.GetFolder(LogFile)
If Folder.files.count > 0 Then
WScript.CreateObject("Wscript.Shell").Run "copy_move.vbs", 1, vbTrue
WScript.CreateObject("Wscript.Shell").Run "netsend.bat", 1, vbTrue
Else
WScript.Quit 
End If

copy_move.vbs

Const OverwriteExisting = True  
Set objFSO = CreateObject("Scripting.FileSystemObject") 
objFSO.CopyFile ".cat1*.*" , ".arch" , OverwriteExisting                                 
objFSO.MoveFile ".cat1*.*" , ".cat2" 
WScript.Quit

netsend.bat

cd %systemroot%system32
chcp 1251
net send 192.168.10.108 Получено сообщение

11 Ответ от alexii 2013-01-24 16:29:13

  • alexii
  • Разработчик
  • Неактивен

Re: VBS: Метод выхода/завершение скрипта

Всё можно объединить в один скрипт.

12 Ответ от Dr.Hofmann 2013-01-24 16:51:35

  • Dr.Hofmann
  • Участник
  • Неактивен
  • Рейтинг : [0|0]

Re: VBS: Метод выхода/завершение скрипта

Всё можно объединить в один скрипт.

Комрад,  напиши название метода раз сказал))

13 Ответ от Rom5 2013-01-24 17:18:58

  • Rom5
  • Участник
  • Неактивен
  • Рейтинг : [1|0]

Re: VBS: Метод выхода/завершение скрипта

Если не планируется еще из другого скрипта вызывать «copy_move.vbs», то просто включите его текст (кроме дублирующегося объявления «Set objFSO») в «стартовый» скрипт вместо вызова

WScript.CreateObject"Wscript.Shell").Run "copy_move.vbs

WBR. Roman

14 Ответ от Rom5 2013-01-24 17:37:04

  • Rom5
  • Участник
  • Неактивен
  • Рейтинг : [1|0]

Re: VBS: Метод выхода/завершение скрипта

Запуск «net send» тоже можете попробовать оформить вызовом в строке с cmd.exe («%comspec%) вместо вызова своего батника. Вот для примера строки запуска команды с паузой:

WScript.CreateObject("Wscript.Shell").Run _
"%comspec% /K chcp 1251 && net send 192.168.10.108 Получено сообщение  &&Pause&&Exit"

WBR. Roman

15 Ответ от Rom5 2013-01-24 17:38:48 (изменено: Rom5, 2013-01-24 19:21:29)

  • Rom5
  • Участник
  • Неактивен
  • Рейтинг : [1|0]

Re: VBS: Метод выхода/завершение скрипта

LogFile = ".cat1" 
Set objFSO = CreateObject("Scripting.FileSystemObject")   
Set Folder = objFSO.GetFolder(LogFile)
If Folder.files.count > 0 Then
    ''''WScript.CreateObject("Wscript.Shell").Run "copy_move.vbs", 1, vbTrue
    Const OverwriteExisting = True  
    objFSO.CopyFile ".cat1*.*" , ".arch" , OverwriteExisting                                 
    objFSO.MoveFile ".cat1*.*" , ".cat2" 
    '--- net send
    WScript.CreateObject("Wscript.Shell").Run "net.exe send 192.168.10.108 Cat1_Msg_RECEIVED!", 1
End If
WScript.Quit 

WBR. Roman

16 Ответ от Dr.Hofmann 2013-01-25 09:25:06

  • Dr.Hofmann
  • Участник
  • Неактивен
  • Рейтинг : [0|0]

Re: VBS: Метод выхода/завершение скрипта

Непонятно <WaitOnReturn> — True / vbTrue метода Run вы убрали его для тех строк которые принадлежат copy_move.vbs — Нужно же понимать что произойдет если по какой либо причине эти строки кода не отработают.

17 Ответ от Rom5 2013-01-25 12:23:20

  • Rom5
  • Участник
  • Неактивен
  • Рейтинг : [1|0]

Re: VBS: Метод выхода/завершение скрипта

Dr.Hofmann пишет:

Непонятно <WaitOnReturn> — True / vbTrue метода Run вы убрали его для тех строк которые принадлежат copy_move.vbs — Нужно же понимать что произойдет если по какой либо причине эти строки кода не отработают.

Операции копирования запускаются уже не отдельным вызовом внешнего скрипта, а внутри основного, т.е. пока они не отработают — далее скрипт не продолжится.
Если не отработают операции копирования из-за ошибок — то получите ошибку и скрипт прервется.

А в вызове через Run отправки сообщения особого смысла в ожидании нет, т.к. после этого вызова Вашему скрипту остается просто завершиттся —  ведь никаих более операций ниже той строки нет.

WBR. Roman

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

I have looked on Google and the answer is not there!

First things first. WScript.Quit DOES NOT WORK! I have no idea what «WScript» is but it clearly has nothing to do with client side scripting for a web page. I have seen this «WScript» thing somewhere before and it just produces errors (maybe obsolete or something) so please do not suggest it…

Anyway… all I wish to do is completely stop the script in the event of a condition not being met. Obviously I don’t want «Exit Sub» because the code would then carry on running if that sub is embedded!

I am aware of the «stop» command but I am under the impression that it is only used for debugging.

Hopefully a very simple question.

UPDATE and Conclusion: Before I close this subject I will just expand a little on what I was trying to do…

I had a number of main subs that were being started by a button click. In order to make it so that I did not have to edit each individual sub I embedded a universal sub within each one that did a preliminary check.

Part of that preliminary check was to stop the program in the case of an incorrect user input. If an error was detected I wanted to halt all progress from that point on. An «exit sub» would obviously just skip the rest of that preliminary sub and the main sub would carry on executing.

In the end it was just a case of writing in an error flag (that is checked in the main subs) or incorporating the error condition operation in each main procedure. In that way you exit the main sub and the problem is solved.

It was not laziness — I just wanted to reduce the amount of code. Thank you for the responses anyway.

Приветствую всех пользователей блога scriptcoding.ru. В этой статье мы рассмотрим основные свойства – их восемь и методы – sleep, quit и echo объекта WScript.

Данный объект является главным, он загружается автоматически и позволяет подключать остальные компоненты объектной модели Windows Script Host: как внутренние, так и внешние. Я решил не рассматривать все его методы и свойства, так как некоторые из них требуют отдельной статьи. Тут мы рассмотрим восемь основных свойств – их стоит знать, так как они позволяют получить информацию, как о самом сценарии, так и о сервере Windows Script Host в целом. Основные WScript методы – quit,sleep и echo, позволяют производить выход из сценария, задавать задержку и выводить данные.

И так, давайте рассмотрим все подробно.

Свойства

wscript методы и свойства

Name – Как правило, данное свойство содержит строку «Сервер сценариев Windows«.

FullName – Содержит полный путь к исполняемому файлу, который обрабатывает текущий сценарий, например, wscript_exe или cscript_exe.

ScriptName – Имя текущего сценария.

ScriptFullNmae – Полный путь к текущему скрипту.

Path – Путь к системному каталогу.

Version – Собственно, версия сервера Windows Script Host.

Timeout – Свойство доступно как для чтения, так и для записи. Определяет время в секундах, через которое сценарий должен завершить работу. По умолчанию значение ровно 0.

BuildVersion – Содержит номер сборки сервера сценариев Windows Script Host.

Методы

wscript quit, wscript sleep и wscript echo

Quit(code) – Текущий метод производит выход из сценария с кодом, который задан параметром code, если код выхода не задан, он устанавливается в ноль. Стоит помнить, что как только будет выполнена последняя строка кода в скрипте, он автоматически завершит свою работу.

Sleep(time) – Позволяет задать задержку в миллисекундах.

Echo(str1, str2,… ) – Пожалуй, самый простой оператор вывода данных. Ему можно передавать как строковые параметры, заключенные в кавычки, так и имена переменных.

И так, с теоретической частью мы закончили, теперь можно приступить к программированию. Для начала рассмотрим такой пример на языке vbscript:

' ***********************************************************' Класс Wscript методы и свойства' wscript echo, wscript sleep и wscript quit' wscript_obj.vbs' ***********************************************************OptionExplicit Dim Msg Msg = "Свойства класса_WScript" & vbCrLf & vbCrLf With WScript     Msg = Msg & "Name: " & .Name & vbCrLf & "FullName: " & .FullName & vbCrLf     Msg = Msg & "ScriptName: " & .ScriptName & vbCrLf & "ScriptFullName: " & .ScriptFullName & vbCrLf     Msg = Msg & "Path: " & .Path & vbCrLf & "Version: " & .Version & vbCrLf     Msg = Msg & "Application: " & .Application & vbCrLf & "Timeout: " & .Timeout & vbCrLf & "BuildVersion: " & .BuildVersion      'используем функцию Wscript Echo для вывода данных     .Echo Msg     'Создаем задержку в 2000 миллисекунд с помощью Wscript Sleep     .Sleep 2000     'устанавливаем время выхода через 2 секунды     .Timeout = 2                               .Echo "Это окно закроется через 2 секунды"     ' Wscript Quit - завершение работы     .QuitEndWith

Давайте подробно рассмотрим программный код скрипта. В данном примере мы сначала составляем список свойств, который будет храниться в переменной Msg. Вывод списка осуществляется с помощью функции Wscript Echo. Потом происходит вызов метода Wscript Sleep со значением параметра в 2000 миллисекунд. Сразу после этого мы присваиваем свойству Timeout значение 2 – количество секунд, через которое сценарий прекратит работу. И в конце идет снова вывод диалогового окна с помощью метода Wscript Echo. Как только диалоговое окно появится, и, если мы не нажмем на кнопку, то оно автоматически закроется через 2 секунды благодаря строке WScript Quit. Обратите внимание, что бы не писать лишний раз имя объекта, мы использовали конструкцию With… End With, тем самым нам достаточно указать имена свойств и методов.

А вот аналогичный пример, но уже на языке JScript:

// ***********************************************************// Класс Wscript методы и свойства// wscript echo, wscript sleep и wscript quit// wscript_obj.js// *********************************************************** var Message; Message ="Свойства класса_WScript"+"nn";with(WScript){     Message+="Name: "+ Name +"nFullName: "+ FullName +"n";     Message+="ScriptName: "+ ScriptName +"nScriptFullName: "+ ScriptFullName +"n";     Message+="Path: "+ Path +"nVersion: "+ Version +"n";     Message+="Application: "+ Application +"nTimeout: "+ Timeout +"nBuildVersion: "+ BuildVersion;      //используем функцию WScript Echo для вывода данных     Echo (Message);     //Создаем задержку в 2000 миллисекунд с помощью Wscript Sleep     Sleep (2000);     //устанавливаем время выхода через 2 секунды     Timeout =2;     Echo ("Это окно закроется через 2 секунды");     // Wscript Quit - завершение работы     Quit();}

Скачать архив с примерами

В данном примере приводятся аналогичные действия, но, стоит всегда обращать внимание на правила синтаксиса языка. Видим, что язык jscript требует наличие точки с запятой в конце каждого оператора и наличие круглых скобок после метода, в которых прописываются параметры. Также не стоит забывать про то, что сам язык чувствителен к регистру. Обратите внимание, что список хранится в переменной Message, как и с языком vbscript, тут для сокращения программного кода мы использовали оператор with.

И так, давайте подытожим: в этой статье мы рассмотрели базовые свойства класса_WScript, а также три метода: wscript echo, wscript quit и wscript sleep.

Вы можете попробовать CloseMainWindow и Close методы на процесс, как описано на MSDN, как:

Sub KillingMeSoftly(processName)

    'partly copied from http://www.activexperts.com/activmonitor/windowsmanagement/adminscripts/processes/    
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\" & strComputer & "rootcimv2")
    Set colProcessList = objWMIService.ExecQuery _
        ("Select * from Win32_Process Where Name = '" & processName & "'")
    For Each objProcess in colProcessList
        objProcess.CloseMainWindow
        objProcess.Close
    Next

End Sub


это был плохой ответ

ОБНОВИТЬ
В поисках ответа я только что обнаружил, что запуск скрипта с параметром //T:nn вызывает событие Terminate для объектов:

class Foo
    sub class_terminate
        msgbox "Gracefull termination"
        ' Put your own termination code here.        
    end sub
end class

dim bar
set bar = new Foo

do 
loop ' makes the script run forever

Сохраните это как c:endless.vbs

Запуск этого сценария никогда не вызовет событие завершения, потому что он будет зависать в бесконечном цикле, но если вы запустите сценарий с тайм-аутом, он будет; Запустите скрипт из командной строки:
C:>wscript endless.vbs //T:5

Вы увидите, что через 5 секунд появится окно сообщения с надписью «Изящное завершение».

Это полезно, когда вы хотите выйти из сценария через определенное время и запустить очистку, если она не была завершена сама по себе. Я не знаю, охватывает ли это решение, которое вы ищете.

Situation:

To keep it simple: I got multiple shortcuts on a network share that starts an VMwareclient application that connects to a console of a virtual machine. The shortcut looks something like this:

\sharevmware-vmrc.exe -h HOST -u USER -p PASS "[LocalStorage] NAME/NAME.vmx"

But i like to know if someone is already using this console connection, so i can avoid starting this shortcut and choose another machine. So i made an script to do this and changed the shortcut to:

C:WindowsSystem32wscript.exe \sharestart.vbs NAME "[LocalStorage] NAME/NAME.vmx"

This opens a vbscript that runs an batch file silent, so it is not visible for the user.

arg = " " & WScript.Arguments.UnNamed(0) & " """ & WScript.Arguments.UnNamed(1) & """"
CreateObject("Wscript.Shell").Run "client.cmd" & arg ,0,False

This opens client.cmd that operates the launch of the VMwareclient and connects to the given virtual machine and writes a logfile to log which user has the Virtual Machine in use.

@echo off
pushd "%~dp0"
set TIMESTAMP=%TIME:~0,2%:%TIME:~3,2%
set CLIENT=%1

:start
IF EXIST logs%client% goto msg
echo %username% since %TIMESTAMP% on %DATE% >logs%client%
start /wait c:vmwareclientvmware-vmrc.exe -h HOST -u USER -p PASS %2
del logs%client%
goto exit

:msg
for /f "delims=" %%x in ('type logs%client%') do set "type=%%x"
echo wscript.quit MsgBox ("%client% is in use by %type%. Do you like to continue?", 4, "%client% is in use") > yesno.vbs
wscript //nologo yesno.vbs
set value=%errorlevel%
del yesno.vbs
if "%value%"=="6" start /wait c:vmwareclientvmware-vmrc.exe -h HOST -u USER -p PASS %2
if "%value%"=="7" goto exit
goto exit

:exit
popd

The variable %client% contains the first parameter given in the shortcut, it represents NAME.

This all works fine. But there is one problem, at «start /wait :..» the scripts waits till the client application is closed. But when the user logs off or shuts down Windows it force closes the script and it doesn’t continue the script to delete the logfile. That causes the logs to be irrelevant because some users who logged off or force closed the script are still present in the logfile as if the virtual machine is still in use.

Problem:

«start /wait» waits till the application is closed, but when a user shuts down windows or logs off the script is force closed and doesn’t continue.

Question:

Is there a solution to detect such force close in batch? (probably not)
Do i need to switch to VBscript or an other program/script language to accomplish this?

Понравилась статья? Поделить с друзьями:
  • Stardew valley что подарить парню
  • Stardew valley что подарить мэру на день рождения
  • Stardew valley что подарить льюису на день рождения
  • Stardew valley что подарить гасу
  • Stardew valley что подарить волшебнику