Не могу остановить службу, используя vbscript - PullRequest
1 голос
/ 01 июня 2011

Я использую следующий код, чтобы попытаться остановить службу. Я могу отобразить состояние службы, используя WScript.Echo objService.State , поэтому я знаю, что у меня правильное имя службы, и оно может найти его и определить его состояние как выполняется или остановлено , но когда я запускаю этот скрипт, я получаю сообщение об ошибке в строке 51: ошибка не найдена, код 80041002 (см. Скриншот)

Строка кода на 51:

 objService.StopService()

Куда я иду не так? Я могу остановить и запустить это через командную строку, используя sc.exe, и могу управлять другими службами, например, Alerter, но как только я пытаюсь управлять этой конкретной службой, она выходит из строя.

Спасибо

РЕДАКТИРОВАТЬ Полный код из сценария (Спасибо Брэндон Моретц, который указал что я не выложил полный код так номер строки ничего не значил и Я изменил StartService () назад Остановиться, как это было изначально, так что теперь у вас есть больше, чтобы продолжить. Извините!)

' 1. Check that the latest backup zip exists and store its name in LBZ (LatestBackupZip)
' 2. Stop the Livecontent Service
' 3. Remove .dbx, .lck and .log files from DataFolder
' 4. restart the service
' 5. Restore the database

Dim fileNewest
Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell") 
'Set ImportFldr = fso.GetFolder("C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data\Import")
Set ImportFldr = fso.GetFolder("C:\Program Files\XyEnterprise\SDL LiveContent\data\export")
'Set DataFldr = fso.GetFolder("C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data")
Set DataFldr = fso.GetFolder("C:\Program Files\XyEnterprise\SDL LiveContent\data")

For Each aFile In ImportFldr.Files
sExtension = fso.GetExtensionName(aFile.Name)
    If sExtension = "log" Then
            'Msgbox "The file extension is a " & sExtension
        Else
            'Msgbox "The file extension is a " & sExtension
                         If fileNewest = "" Then
                        Set fileNewest = aFile  
                     Else
                     'If fileNewest.DateCreated < aFile.DateCreated Then
                        If CDate(fileNewest.DateCreated) < CDate(aFile.DateCreated) Then

                            Set fileNewest = aFile
                     End If
                    End If
                End If
Next
Msgbox "The Newest File in the folder is " & fileNewest.Name & chr(13) & "Size: " & fileNewest.Size & " bytes" & chr(13) & "Was last modified on " & FileNewest.DateLastModified 

' Change to /Data
'WScript.Echo WshShell.CurrentDirectory 
WshShell.CurrentDirectory = DataFldr
'WScript.Echo WshShell.CurrentDirectory 

' Stop the Livecontent service
strComputer = "."
Dim objService
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service where Name = 'LiveContent'")

For Each objService in colServiceList
WScript.Echo objService.State
    If objService.State = "Running" Then
        objService.StopService()
        'Wscript.Sleep 5000
    End If 
Next


'Dim objShell
'Set objShell = CreateObject("WScript.Shell")
'objShell.Run "%comspec% /k c: & cd ""C:\Program Files (x86)\XyEnterprise\SDL LiveContent\"" & """"loaddb RESTORE -'Dlc.file=C:\PROGRA~2\XYENTE~1\SDLLIV~1\data\Import\" & fileNewest.Name & " -Dlc.pswd=N2kAs72z"""""

script error when trying to stop service

ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ

Я взял ваш код и до сих пор не могу заставить его работать. Я заметил, что строка:

Set objWMIService = GetObject ("winmgmts: \" & strComputer & "\ root \ cimv2")

отсутствовал \ at "winmgmts: \", который я добавил, и мне нравится ваша проверка, чтобы увидеть, есть ли каталог (x86), так как я тестирую его на 32-битном сервере, но при перемещении на 64 оно готово, чтобы оно работало хорошо.

Также этот раздел не работал:

If fso.FolderExists( "C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data" ) Then
    Set DataFldr= fso.GetFolder("C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data")
Else If fso.GetFolder("C:\Program diles\XyEnterprise\SDL LiveContent\data") Then
    Set DataFldr= fso.GetFolder("C:\Program diles\XyEnterprise\SDL LiveContent\data")
End If

Но сделал, если я изменил ElseIf fso.GetFolder на fso.FolderExists

Сценарий работает нормально, если я закомментирую строку 78

objService.StopService ()

Но как только я раскомментирую это, я получаю ошибку:

Строка: 78
Char: 9
Ошибка не найдена Код: 80041002 Источник: SWbemObjectEx

Но Службу можно найти в виде строки: WScript.Echo objService.State Отображает свое состояние на экране.

Действительно сбит с толку.

' 1. Check that the latest backup zip exists and store its name in LBZ (LatestBackupZip)
' 2. Stop the Livecontent Service
' 3. Remove .dbx, .lck and .log files from DataFolder
' 4. restart the service
' 5. Restore the database

Dim fileNewest
Dim ImportFldr
Dim DataFldr
Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")


If fso.FolderExists( "C:\Program Files\XyEnterprise\SDL LiveContent\data\Import" ) Then
    Set ImportFldr = fso.GetFolder("C:\Program Files\XyEnterprise\SDL LiveContent\data\Import")
  Else 
    WScript.Echo "Warning: Import Directory can not be found"   
End If

If fso.FolderExists( "C:\Program Files\XyEnterprise\SDL LiveContent\data\export" ) Then
    Set ImportFldr = fso.GetFolder("C:\Program Files\XyEnterprise\SDL LiveContent\data\export")
Else 
    WScript.Echo "Warning: Export Directory can not be found"   
End If
If fso.FolderExists( "C:\Program Files\XyEnterprise\SDL LiveContent\data" ) Then
    Set DataFldr= fso.GetFolder("C:\Program Files\XyEnterprise\SDL LiveContent\data")
Else 
    WScript.Echo "Warning: Data Directory can not be found"     
End If    



For Each aFile In ImportFldr.Files
    sExtension = fso.GetExtensionName(aFile.Name)


If sExtension = "log" Then
        'Msgbox "The file extension is a " & sExtension
    Else
        'Msgbox "The file extension is a " & sExtension
                If fileNewest = "" Then
                    Set fileNewest = aFile  
                Else
                    If fileNewest.DateCreated < aFile.DateCreated Then
                        If CDate(fileNewest.DateCreated) < CDate(aFile.DateCreated) Then
                            Set fileNewest = aFile
                        End If
                    End If
                End If
    End If

Next
'Msgbox "The Newest File in the folder is " & fileNewest.Name & chr(13) & "Size: " & fileNewest.Size & " bytes" & chr(13) & "Was last modified on " & FileNewest.DateLastModified


' Change to /Data
WScript.Echo WshShell.CurrentDirectory
WshShell.CurrentDirectory = DataFldr
WScript.Echo WshShell.CurrentDirectory


' Stop the Livecontent service




strComputer = "."
Dim objService
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service where Name = 'LiveContent'")

For Each objService in colServiceList
WScript.Echo objService.State
    If objService.State = "Running" Then
        objService.StopService()
        WScript.Echo objService.State
        Wscript.Sleep 5000
    End If
Next

РЕДАКТИРОВАТЬ 2

После очень обширного тестирования мы пришли к выводу, что в скрипте нет ничего плохого, просто этот конкретный сервис не остановится этим методом.

С этой целью мы пошли дальше и теперь используем

objShell.Run "sc start LiveContent"

И это работает удовольствие.

Спасибо Брэндону за помощь.

Ответы [ 2 ]

1 голос
/ 01 июня 2011

Есть несколько незначительных проблем:

1.) Не проверяется, существует ли папка для вызова get, это и стало причиной вашей ошибки «Not Found».

2.) Несоответствующие операторы If ... Then & End в вашем файловом цикле. (Я бы, наверное, выбрал лучший редактор для vbscript, очень полезны программисты notepad и notepad ++.)

3.) Смешение StartService () / StopService (), о котором я упоминал ранее.


' 1. Check that the latest backup zip exists and store its name in LBZ (LatestBackupZip)
' 2. Stop the Livecontent Service
' 3. Remove .dbx, .lck and .log files from DataFolder
' 4. restart the service
' 5. Restore the database</p>

<p>Dim fileNewest</p>

<p>Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")</p>

<p>Set WshShell = WScript.CreateObject("WScript.Shell")</p>

<p>Dim ImportFldr</p>

<p>If fso.FolderExists( "C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data\Import" ) Then
    Set ImportFldr = fso.GetFolder("C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data\Import")
Else If fso.FolderExists( "C:\Program Files\XyEnterprise\SDL LiveContent\data\export" ) Then
    Set ImportFldr = fso.GetFolder("C:\Program Files\XyEnterprise\SDL LiveContent\data\export")
End If</p>

<p>Dim DataFldr</p>

<p>If fso.FolderExists( "C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data" ) Then
    Set DataFldr= fso.GetFolder("C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data")
Else If fso.GetFolder("C:\Program diles\XyEnterprise\SDL LiveContent\data") Then
    Set DataFldr= fso.GetFolder("C:\Program diles\XyEnterprise\SDL LiveContent\data")
End If</p>

<p>For Each aFile In ImportFldr.Files
    sExtension = fso.GetExtensionName(aFile.Name)</p>

<pre><code>If sExtension = "log" Then
        'Msgbox "The file extension is a " & sExtension
    Else
        'Msgbox "The file extension is a " & sExtension
                If fileNewest = "" Then
                    Set fileNewest = aFile  
                Else
                    If fileNewest.DateCreated < aFile.DateCreated Then
                        If CDate(fileNewest.DateCreated) < CDate(aFile.DateCreated) Then
                            Set fileNewest = aFile
                        End If
                    End If
                End If
    End If

Следующий Msgbox «Самым новым файлом в папке является» & fileNewest.Name & chr (13) & «Size:» & fileNewest.Size & «bytes» & chr (13) & «Последнее изменение» & FileNewest.DateLastModified

'Изменить на / Данные 'WScript.Echo WshShell.CurrentDirectory WshShell.CurrentDirectory = DataFldr 'WScript.Echo WshShell.CurrentDirectory

'Остановить службу Livecontent strComputer = "." Dim objService Set objWMIService = GetObject ("winmgmts: \" & strComputer & "\ root \ cimv2")

Set colServiceList = objWMIService.ExecQuery _ («Выбрать * из Win32_Service, где Name =« LiveContent »»)

Для каждого объекта objService в colServiceList WScript.Echo objService.State If objService.State = "Running" Тогда objService.StopService () Wscript.Sleep 5000 End If Далее

'Dim objShell 'Set objShell = CreateObject ("WScript.Shell") 'objShell.Run "% comspec% / kc: & cd" "C: \ Program Files (x86) \ XyEnterprise \ SDL LiveContent \" "&" "" "loaddb RESTORE -'Dlc.file = C: \ PROGRA ~ 2 \ XYENTE ~ 1 \ SDLLIV ~ 1 \ data \ Import \ "& fileNewest.Name &" -Dlc.pswd = N2kAs72z "" "" "

0 голосов
/ 08 июня 2011

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

Комус этой целью мы пошли дальше и теперь используем

objShell.Run "sc start LiveContent"

И это работает.

Спасибо Брэндон за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...