Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Кавычки внутри кавычек в VBS (http://forum.oszone.net/showthread.php?t=196665)

BigBoo 15-01-2011 00:31 1589002

Кавычки внутри кавычек в VBS
 
Возможно вопрос банален, но никак не могу разобраться, как использовать кавычки внутри кавычек в VBS. То есть, например даже элементарная команда
Код:

msgbox "Меню "Пуск""
выдаёт ошибку. Хочу напечатать именно Меню "Пуск" ,а не Меню Пуск. Так же и с другими командами. Пишу скрипт добавляющий строки в файл и в этих строчках есть кавычки. Был бы признателен за помощь.

Iska 15-01-2011 03:20 1589040

Удваивать:
Код:

msgbox "Меню ""Пуск"""

BigBoo 15-01-2011 12:05 1589173

Спасибо, тема закрыта.

BigBoo 16-01-2011 20:23 1590086

В дополнение к теме, запуск приложения со строкой, содержащей путь.
Так не работает, ошибка - файл не найден:
Код:

WSHShell.Run "C:\Program Files\Internet Explorer\Iexplore.exe www.ya.ru"
А вот так работает:
Код:

WSHShell.Run """C:\Program Files\Internet Explorer\Iexplore.exe"" www.ya.ru"
Строка запуска заключается в ТРОЙНЫЕ кавычки!

SendMessage 17-01-2011 12:57 1590585

Цитата:

Цитата BigBoo
Строка запуска заключается в ТРОЙНЫЕ кавычки! »

Просто путь C:\Program Files\Internet Explorer\Iexplore.exe содержит пробелы и его, естественно, надо заключать в кавычки, чтобы корректно отработала командная строка. А поскольку этот путь находится внутри строки, то и удваиваются кавычки вокруг этого пути.
Обычный путь - без пробелов, не обязательно заключать в кавычки. Например:
Код:

WSHShell.Run "C:\Windows\notepad.exe c:\test.txt"

BigBoo 17-01-2011 14:46 1590689

Цитата:

Цитата SendMessage
А поскольку этот путь находится внутри строки, то и удваиваются кавычки »

Но ведь такая конструкция не работает:
Код:

WSHShell.Run ""C:\Program Files\Internet Explorer\Iexplore.exe""
А работает только с ТРОЙНЫМИ кавычками:
Код:

WSHShell.Run """C:\Program Files\Internet Explorer\Iexplore.exe"""
Честно не знаю, для чего нужно утраивать кавычки, но работает только так!
С путями без пробелов согласен, да это и само собой разумеется.

SendMessage 17-01-2011 15:41 1590737

Цитата:

Цитата BigBoo
Но ведь такая конструкция не работает: »

Потому что, как написал Iska, кавычки, если они находятся внутри текста vbs, а он в нем всегда обрамляется кавычками, должны удваиваться.
В конструкции WSHShell.Run ""C:\Program Files\Internet Explorer\Iexplore.exe"" внешние кавычки относятся не к тексту, а к обрамлению текста. А сам текст такой - "C:\Program Files\Internet Explorer\Iexplore.exe". Но чтобы vbs правильно отображал кавычки в самом тексте - их делают двойными.
Поэтому они и вышли тройными - WSHShell.Run """C:\Program Files\Internet Explorer\Iexplore.exe""" - относящиеся к обрамлению текста я выделил красным, а кавычки текста синим.
Надеюсь, теперь понятно до конца?

Кстати, если в vbs нужно передать, например, текст состоящий из кавычек, вот такой:
Код:

""
то записать придется так:
Код:

""""""
:)

BigBoo 30-01-2011 23:28 1600757

Помогите люди добрые, битый час бьюсь. Сколько только кавычек не ставил - результат нулевой! Как сделать, чтоб это заработало:
Код:

Set Create = CreateObject("Scripting.FileSystemObject") 
Set Folder = Create.GetFolder(WshShell.CurrentDirectory) 
Str = Folder.Path &"\Папка\Прога.exe" 
WSHShell.Run Str


OSArev 31-01-2011 00:06 1600775

Цитата:

Цитата BigBoo
Помогите люди добрые, битый час бьюсь »

Если, только запустиь прогу, то:
Код:

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("Полный_путь\прога.exe")

Если нет, то мысль яснее

Iska 31-01-2011 00:21 1600785

Код:

Str = Folder.Path &"\Папка\Прога.exe"
WSHShell.Run """" & Str & """"


BigBoo 31-01-2011 00:23 1600786

OSArev, спасибо, через Exec работает. Получается, что в команде Run нельзя использовать переменные и дело здесь не в кавычках?

Iska, Увидил Ваше сообщение позже. Да, интересное решение, ни за что бы не додумался! :tease:

OSArev 31-01-2011 02:53 1600844

Цитата:

Цитата BigBoo
Получается, что в команде Run нельзя использовать переменные и дело здесь не в кавычках? »

Run используется немного в других случаях.Вот долго не рылся первый попавшийся пример:
Код:

Dim objWshShell, strFileName, strFullFileName, Message, Title, OpenTextFile, MyVar
Message = "Введите название:"
Title = "Создание документа в формате RTF."
Set objFSO      = WScript.CreateObject("Scripting.FileSystemObject")
Set objWshShell = WScript.CreateObject("WScript.Shell")

Do Until False
  strFileName = InputBox(Message, Title)
  If strFileName = "" Then
    MyVar = MsgBox("Вы не ввели название или " & Chr(10) & "в название есть недопустимые символы!" & Chr(10) & "" & Chr(10) & "ВВЕДИТЕ НАЗВАНИЕ!!!", vbRetryCancel + vbExclamation, "Демонстрационное окно сообщения")
    If MyVar = vbCancel Then WScript.Quit
  Else
    Exit Do
  End If
Loop
 
  strFullFileName = objFSO.BuildPath(objWshShell.SpecialFolders("C , D ,"), strFileName)
  If objFSO.FileExists(strFullFileName & ".rtf") Then
    WScript.Echo "Документ  ''"& strFileName &".rtf'' - уже существует."
On Error resume Next
    objWshShell.Run(strFullFileName & ".rtf")
    WScript.Quit 0
  Else
    objFSO.CreateTextFile strFullFileName & ".rtf"
  End If

On Error resume Next
    objWshShell.Run(strFullFileName & ".rtf")


Set objWshShell = Nothing
Set objFSO      = Nothing
    WScript.Quit 0

Попробуй. Кстати изменив разрешение .rtf на любое другое, можно создавать практически все объекты.
Очень удобно в повседневной работе.У меня подобные скрипты прописаны в реестре.
Но я сам только с месяца полтора этим увлёкся, так, что извини если будут какие-нибудь накладки
Цитата:

Цитата BigBoo
Да, интересное решение, ни за что бы не додумался! »

Если это "неподкол", то огромное спасибо за спасибо...
Но, я в принципе ещё ничего толком не умею. Поэтому буду рад общению и любым советам.

BigBoo 21-02-2011 02:13 1618051

Ну просто проблемы какие-то с этими кавычками, особенно при использовании команды Run. Подскажите, как сделать, чтобы заработало?
Код:

  WSHShell.Run "cacls """"D:\" & Fold"" /E /G ""User"":F"

Iska 21-02-2011 02:35 1618055

BigBoo, у Вас тут непонятная мешанина.

Попробуйте так (если я правильно понял):
Код:

WSHShell.Run "cacls.exe ""D:\" & Fold & """ /E /G " & User & ":F"

BigBoo 21-02-2011 03:17 1618064

Iska, спасибо, именно то что нужно. Только смутила логика подсветки кавычек, наверно должно быть как-то так:
Код:

WSHShell.Run "cacls.exe ""D:\" & Fold & """ /E /G " & User & ":F"

Iska 21-02-2011 05:12 1618071

Я подсветил те кавычки, которые превращаются в одну.

BigBoo 22-07-2011 00:18 1717455

Опять вопрос о кавычках в команде Run. Вот такой скрипт:
Код:

NameExe =  "Nero.exe" 
Target = WshShell.ExpandEnvironmentStrings("%ProgramFiles%") & "\Nero\Nero 10\Nero Burning ROM\"   

WSHShell.Run """" & Target & NameExe

В посте выше предлагалось сделать так:
Код:

WSHShell.Run """" & Target & NameExe & """"
Оказалось, работает и без последних кавычек, но вот без первых нет:
Код:

WSHShell.Run Target & NameExe & """"
Никто не пояснит?

Iska 22-07-2011 09:57 1717596

BigBoo, детали, почему так, а не иначе — как обычно, смотрите в MSDN: CreateProcess Function (Windows).

C0D3X 18-02-2015 15:31 2472956

Люди, помогите! Голову сломал - ничего не помогает.
Есть командная строка (из bat-файлика точно рботает!):

Код:

Net Stop "FileZilla Server"||(For /F "tokens=3" %%A In ('SC queryex "FileZilla Server"^|Find "PID"') Do (TaskKill /F /PID %%A>nul Ping -n 20 127.0.0.1>nul)) & Net start "FileZilla Server"
Необходимо запустить ее из vbs скрипта.
Пробовал так:

Код:

Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Run "cmd /c @Echo Off & Set ServiceName=""FileZilla Server"" & Net Stop %ServiceName%||(For /F ""tokens=3"" %%A In ('SC queryex %ServiceName%^|Find ""PID""') Do (TaskKill /F /PID %%A>nul Ping -n 20 127.0.0.1>nul)) & Net start %ServiceName%",0,true

и так:

Код:

Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Run "Net Stop ""FileZilla Server""||(For /F ""tokens=3"" %%A In ('SC queryex ""FileZilla Server""^|Find ""PID""') Do (TaskKill /F /PID %%A>nul Ping -n 10 127.0.0.1>nul)) & Net Start ""FileZilla Server""",0,true

Скрипт не выдает ошибок, но и ничего не выполняет %) думаю ошибка в ковычках, но уже и 3 и 4 ковычки пробовал результата 2: либо ошибка выполнения команды (из-за неправильных ковычек), либо отсутствие вообще всего :(

Помогите пожалуйста!)

Iska 18-02-2015 17:15 2472998

Цитата:

Цитата C0D3X
думаю ошибка в ковычках, »

Думаю, Вам незачем тупо переносить код пакетного файла в скрипт. И зачем Вам именно в таком виде — разве сервис не останавливается?

Код:

Option Explicit

Dim strServiceName

Dim objSWbemObjectEx


strServiceName = "messenger"

With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
        With .Get("Win32_Service.Name='" & strServiceName & "'")
                If .State = "Running" Then
                        If Not .StopService() = 0 Then
                                WScript.Echo "Can't stop service [" & strServiceName & "]."
                        End If
                End If
        End With
End With

WScript.Quit 0


C0D3X 20-02-2015 04:58 2473689

Спасибо, Iska! Это хорошее решение, но хотелось бы доработать этот код с такой целью, что: а вдруг сервис завис и простая остановка тут не поможет? Тогда, подождав секунд 10, будет необходимо убить соответствующий процесс и запустить сервис заново. Как будет выглядеть скрипт именно с такой задачей?

Iska 20-02-2015 07:07 2473707

Во-первых, нужно не снимать процесс, а разбираться в причинах зависания сервиса. Во-вторых, логика «остановить сервис; если не останавливается — снять процесс сервиса, затем запустить сервис заново» мне не понятна.

C0D3X 20-02-2015 09:40 2473741

Цитата:

Цитата Iska
Во-первых, нужно не снимать процесс, а разбираться в причинах зависания сервиса. Во-вторых, логика «остановить сервис; если не останавливается — снять процесс сервиса, затем запустить сервис заново» мне не понятна. »

Всё просто: Windows есть Windows и зависание программ в этой ОС еще никто не отменял. Суть задания такая, что программа будет следить за работой ftp сервера, через который происходит обмен с региональными офисами (распределенный базы 1С), важно обеспечить бесперебойность работы этого обмена. Если сервис завис (а часто бывает так, что ты пытаешься остановить его и строка остановки медленно-медленно двигается, но сервис завис он не может быть остановлен штатно, приходится вручную убивать соответствующий процесс и запускать сервис заново - опля! все снова заработало, до следующего глюка). Так понятнее?
Просто все это сейчас делается руками по звонку одного из филиалов - надо автоматизировать)

Iska 20-02-2015 10:04 2473745

У меня не случалось, чтобы служба «FileZilla Server» зависала. Если у Вас, как Вы пишете:
Цитата:

Цитата C0D3X
а часто бывает так, что ты пытаешься остановить его и строка остановки медленно-медленно двигается, но сервис завис он не может быть остановлен штатно »

— Вы пытались найти причину такого поведения?

Цитата:

Цитата C0D3X
Просто все это сейчас делается руками по звонку одного из филиалов - надо автоматизировать) »

Поясните по поводу автоматизации. В новом сценарии звонок из филиала остаётся в наличии?

C0D3X 20-02-2015 17:26 2473921

Iska, меня полностью устраивает ваше решение

Все что мне нужно это доработать это решение до примерно такого:
Код:

Option Explicit

Dim strServiceName

Dim objSWbemObjectEx


strServiceName = "messenger"

With WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
        With .Get("Win32_Service.Name='" & strServiceName & "'")
                If .State = "Running" Then
                        If Not .StopService() = 0 Then
                                Sleep 20000 'Ждем - может процесс все-таки с задержкой, но завершится
                                If .State = "Running" Then 'Если и спустя 20 секунд все еще запущен,то
                                        'Вызов функции поиска ID процесса, отвечающего за зависший сервис
                                        '"Убийство соответствующего PID
                                        'Вызов функции стартующей сервис
                                End If
                        End If
                End If
        End With
End With

WScript.Quit 0

Iska, я уверен тебе вполне по силам помочь в данной задачке, пожалуйста помоги, а историю своей жизни и работы я как-нибудь в следующий раз распишу.
Спасибо!

Цитата:

Цитата Iska
Поясните по поводу автоматизации. В новом сценарии звонок из филиала остаётся в наличии? »

Зачем звонок если сервис будет самовосстанавливаться автоматически (средствами винды - задание по расписанию)?

Iska 21-02-2015 09:47 2474082

C0D3X, у Вас нет задачи. У Вас есть придуманное якобы решение, которое ни разу не решает реальной задачи.

Что на самом деле происходит со службой? Как определяете, что она «зависает»? Что сообщает ОС о «зависшей» службе? Что в журналах событий? Что в логах самой службы? Каково состояние службы в этот момент? Вот какие вопросы надо задавать, и какие задачи решать, вместо того, чтобы тупо периодически перезапускать службу в процессе работы. Это не решение, это извращение. Попытка закрыть глаза на реально существующую проблему.

Я, конечно, нарисую Вашу хотелку, но проверить её работоспособность банально не смогу, поскольку у меня никогда такой проблемы с «FileZilla Server» не возникало.
Скрытый текст
Код:

Option Explicit

Dim strServiceName

Dim objSWbemServicesEx
Dim objSWbemObjectEx


strServiceName = "FileZilla Server"


Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
Set objSWbemObjectEx = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceName & "'")

If objSWbemObjectEx.Started Then
        If objSWbemObjectEx.AcceptStop Then
                If objSWbemObjectEx.StopService() = 0 Then
                        Do
                                WScript.Sleep 100
                               
                                Set objSWbemObjectEx = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceName & "'")
                        Loop While objSWbemObjectEx.Started
                       
                        StartService
                Else
                        WScript.Echo "Can't stop service [" & strServiceName & "]."
                       
                        With objSWbemServicesEx.Get("Win32_Process.Handle='" & CStr(objSWbemObjectEx.ProcessID) & "'")
                                If .Terminate() = 0 Then
                                        StartService
                                Else
                                        WScript.Echo "Can't terminate process of service [" & strServiceName & "]."
                                End If
                        End With
                End If
        Else
                WScript.Echo "Service [" & strServiceName & "] can't be stopped."
        End If
Else
        StartService
End If

Set objSWbemObjectEx  = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub StartService()
        If objSWbemObjectEx.StartService() = 0 Then
                Do
                        WScript.Sleep 100
                       
                        Set objSWbemObjectEx = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceName & "'")
                Loop Until objSWbemObjectEx.Started
        Else
                WScript.Echo "Can't start service [" & strServiceName & "]."
        End If
End Sub
'=============================================================================


C0D3X 22-02-2015 13:59 2474500

Iska, огромное спасибо! Абалденный код! :)
А на счет вопросов: у меня тоже пока не было проблем, но поднять этот сервис пришлось совсем недавно и большого опыта работы с ним нет, а в отпуск уходить совсем скоро... Так вот такая последовательность действий решает 99% процентов проблем, которые могут случиться с сервисом, а это значит, что меня не вытащат посреди отпуска на работу из-за того, что не работает FTP. Возможно траблы не случаться вобще никогда и этот код так никогда на 100% и не сработает, но ведь предвидеть и попытаться предотвратить лучше, чем предвидеть и ждать "авось".... Согласны? :)
Еще раз большое спасибо!

Iska 22-02-2015 20:23 2474610

Цитата:

Цитата C0D3X
А на счет вопросов: у меня тоже пока не было проблем, »

[Iska бьётся головой об стену] Так какого ж @#$%…

C0D3X 23-02-2015 10:29 2474769

Iska, голову осторожнее она еще пригодится и не только тебе. От чего столько негодующих эмоций?! Тебя попросили помочь и ты помог, причем этим кодом дал много пищи для размышлений о том как автоматизировать другие процесс, так как, например, запуск 1с с определенной обработкой, перезапуск процессов отвечающих за связь с торг.представителями. Короче, Iska, Все норм! твой код послужил примером для написания еще 3 скриптов, так что что жил, то не зря ;) Удачи! и больше позитива :)


Время: 11:14.

Время: 11:14.
© OSzone.net 2001-