Страницы 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, позволяют производить выход из сценария, задавать задержку и выводить данные.
И так, давайте рассмотрим все подробно.
Свойства
Name – Как правило, данное свойство содержит строку «Сервер сценариев Windows«.
FullName – Содержит полный путь к исполняемому файлу, который обрабатывает текущий сценарий, например, wscript_exe или cscript_exe.
ScriptName – Имя текущего сценария.
ScriptFullNmae – Полный путь к текущему скрипту.
Path – Путь к системному каталогу.
Version – Собственно, версия сервера Windows Script Host.
Timeout – Свойство доступно как для чтения, так и для записи. Определяет время в секундах, через которое сценарий должен завершить работу. По умолчанию значение ровно 0.
BuildVersion – Содержит номер сборки сервера сценариев Windows Script Host.
Методы
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?