Войти

Показать полную графическую версию : [решено] скрипт: перечень сервисов и статусов, как поправить кодировку и отсортировать?


andr_mozg
18-12-2012, 14:56
Скрипт выглядит так

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colRunningServices = objWMIService.ExecQuery("Select * from Win32_Service")

For Each objService in colRunningServices
Wscript.Echo objService.DisplayName & VbTab &"|"& VbTab & objService.State
Next


руские буквы отображатет некоректно,
как поменять на 1251 кодировку
и отсортировать по именам сервисов?

спасибо

Iska
18-12-2012, 17:17
руские буквы отображатет некоректно, »
Где отображает?

как поменять на 1251 кодировку »
Где менять, зачем менять?

и отсортировать по именам сервисов? »
Они и так отсортированы по именам. Добавьте «objService.Name» в выдачу и посмотрите.

andr_mozg
18-12-2012, 21:38
скрипт отрабатывает на удаленной машине с Русской виндой.
при выводе русские буквы отображаются криво.

как отсортировать по дисплей нейму, а не по нейму?

Iska
19-12-2012, 01:42
скрипт отрабатывает на удаленной машине с Русской виндой. при выводе русские буквы отображаются криво. »
Как? Так?
strComputer = "RemoteMachineName"
Покажите скриншот. Разницы не должно быть, независимо от того, на локальной (".") или удалённой ("RemoteMachineName") машинах сие происходит.

как отсортировать по дисплей нейму, а не по нейму? »
Например, так:
Option Explicit

Const adVarChar = 200

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


strComputer = "."

Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Service")

With WScript.CreateObject("ADODB.Recordset")
With .Fields
.Append "Name", adVarChar, 2^15 - 1
.Append "DisplayName", adVarChar, 2^15 - 1
.Append "State", adVarChar, 2^15 - 1
End With

.Open
.Sort = "DisplayName ASC"

For Each objSWbemObjectEx In collSWbemObjectSet
.AddNew Array("Name", "DisplayName", "State"), Array(objSWbemObjectEx.Name, objSWbemObjectEx.DisplayName, objSWbemObjectEx.State)
Next

.MoveFirst

Do Until .EOF
With .Fields
WScript.Echo .Item("Name").Value, vbTab, .Item("State").Value, vbTab, .Item("DisplayName").Value
End With

.MoveNext
Loop

.Close
End With

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing

WScript.Quit 0

andr_mozg
19-12-2012, 07:08
скрипт запускает удаленно агент, видимо в этом проблема. по аналогии с Psexec, тоесть скрипт запускается локально на удаленном хосте, а ответ передается обратно.

Iska
19-12-2012, 07:29
andr_mozg, прямо ответьте на вопрос — Вы указываете имя/адрес удалённой машины здесь:
strComputer = "RemoteMachineName"
?

И где скриншот? Не вижу его в Вашем сообщении.

andr_mozg
19-12-2012, 09:52
нет. скрипт запускается тот что в первом посте. он запускается локально но ответ возвращает агент обратно.

если использую CMD
и пишу ipconfig
то русские буквы так же не читаемы(кривая кодировка)!
но если пишу chcp 1251 && ipconfig
то все ок.

скриншот могу кинуть, но позже нет под рукой.

Iska
19-12-2012, 10:46
Что такое «агент»? Почему не используете указанный способ подключения?

andr_mozg
19-12-2012, 11:11
на куче машин стоит агент.
он умеет удаленно управлять машиной,
и так же поддерживает работу VBS , через CMD и т.д.

все запускается локально, ответ получаю я на серверной части.
скрипт запускается как в первом посте, локально!!!! не как не иначе.
так более понятно?

Iska
19-12-2012, 15:09
Понятно. Что или Вы знать не знаете, или не хотите сказать — ни что за «агент», ни привести скриншот.

andr_mozg
19-12-2012, 15:20
я знаю что за агент но думаю что ВАМ это не скажет не очем, и скриншот непонятно зачем.

агент - OVO (это агент HP Operation Manager)
запускаю я все это с HP BSM (к которому подключен HP Operation Manager), и туда же приходит ответ.

как это может помочь сменить кодировку ?

Iska
19-12-2012, 17:21
я знаю что за агент но думаю что ВАМ это не скажет не очем, »
Скажет.

и скриншот непонятно зачем.

как это может помочь сменить кодировку ?»
Я ж волшебник :lol:.

Попробуйте так:
Option Explicit

Const adVarChar = 200

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


strComputer = "."

Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Service")

With WScript.CreateObject("ADODB.Recordset")
With .Fields
.Append "Name", adVarChar, 2^15 - 1
.Append "DisplayName", adVarChar, 2^15 - 1
.Append "State", adVarChar, 2^15 - 1
End With

.Open
.Sort = "DisplayName ASC"

For Each objSWbemObjectEx In collSWbemObjectSet
.AddNew Array("Name", "DisplayName", "State"), Array(objSWbemObjectEx.Name, objSWbemObjectEx.DisplayName, objSWbemObjectEx.State)
Next

.MoveFirst

Do Until .EOF
With .Fields
WScript.Echo StrConvert(.Item("Name").Value & vbTab & .Item("State").Value & vbTab & .Item("DisplayName").Value, "windows-1251", "cp866")
WScript.Echo StrConvert(.Item("Name").Value & vbTab & .Item("State").Value & vbTab & .Item("DisplayName").Value, "cp866", "windows-1251")
End With

.MoveNext
Loop

.Close
End With

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing

WScript.Quit 0
В вывод пойдут две строки:
WScript.Echo StrConvert(.Item("Name").Value & vbTab & .Item("State").Value & vbTab & .Item("DisplayName").Value, "windows-1251", "cp866")
WScript.Echo StrConvert(.Item("Name").Value & vbTab & .Item("State").Value & vbTab & .Item("DisplayName").Value, "cp866", "windows-1251")

Посмотрите по полученному выводу, не подойдёт ли Вам какая-либо из них. Лишнюю уберите.

andr_mozg
19-12-2012, 19:56
Спасибо, думаю что вариант вывода номер 2 мой случай, завтра узнаю.
Глядя на все это решил поизучать VBS, и попробовать решить данную задачу посвоему.

P.S. не все понятно по скрипту, если можно прокоментить бы. (сортировка например)

Iska
20-12-2012, 05:22
P.S. не все понятно по скрипту, если можно прокоментить бы. (сортировка например) »
Особо комментировать-то там и нечего.

Создаём набор записей. Добавляем в его структуру три текстовых поля. Задаём сортировку по указанному полю по возрастанию. Перебирая перечень служб, добавляем записи в набор. Затем перемещаемся к первой записи и перебираем весь набор.

Была б в WQL возможность задать сортировку — этого бы кода не потребовалось.

andr_mozg
21-12-2012, 12:08
пишит что переменная не определена StrConvert

Iska
21-12-2012, 15:53
В этом (http://forum.oszone.net/post-2049025.html#post2049025) посте нажмите текст «читать дальше». Откроется спойлер с кодом.

andr_mozg
22-12-2012, 12:11
ну вобщем тот код я и пробовал.
на своей машине запускал и на других, ответ тот же.

Iska
22-12-2012, 14:29
Стыд. Стыд и позор. Я не представляю — как?! Как могло случиться, что я ошибся в таком элементарном действии, как вставка кода в сообщение?! Как я мог на этом этапе потерять функцию?! Ладно, шут с ним. Но почему я не проверил код после Вашего первого сообщения, а решил, что Вы пытались запустить две строки вместо кода из спойлера?! И с настойчивостью долдона твердил одно и то же, вместо того, чтобы просто взять и проверить сам код? Не знаю.

Коллега! Я был не прав. Приношу Вам свои искренние извинения, буде таковые могут быть приняты.

Вот тот же код вместе с потерянной функцией:
Option Explicit

Const adVarChar = 200

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


strComputer = "."

Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Service")

With WScript.CreateObject("ADODB.Recordset")
With .Fields
.Append "Name", adVarChar, 2^15 - 1
.Append "DisplayName", adVarChar, 2^15 - 1
.Append "State", adVarChar, 2^15 - 1
End With

.Open
.Sort = "DisplayName ASC"

For Each objSWbemObjectEx In collSWbemObjectSet
.AddNew Array("Name", "DisplayName", "State"), Array(objSWbemObjectEx.Name, objSWbemObjectEx.DisplayName, objSWbemObjectEx.State)
Next

.MoveFirst

Do Until .EOF
With .Fields
WScript.Echo StrConvert(.Item("Name").Value & vbTab & .Item("State").Value & vbTab & .Item("DisplayName").Value, "windows-1251", "cp866")
WScript.Echo StrConvert(.Item("Name").Value & vbTab & .Item("State").Value & vbTab & .Item("DisplayName").Value, "cp866", "windows-1251")
End With

.MoveNext
Loop

.Close
End With

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing

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

'=============================================================================
Function StrConvert(strText, strSourceCharset, strDestCharset)
Const adTypeText = 2
Const adModeReadWrite = 3

With WScript.CreateObject("ADODB.Stream")
.Type = adTypeText
.Mode = adModeReadWrite

.Open
.Charset = strSourceCharset
.WriteText strText

.Position = 0
.Charset = strDestCharset

strConvert = .ReadText
End With
End Function
'=============================================================================

andr_mozg
24-12-2012, 11:14
Да все ОК, я догадывался что функция должна быть или может библиотека какая, но так как в VBS не особо, то и оценить не могу.
Главное разобрались, я обычно на AutoIT пишу, меня для всех моиз задачь он устраивал, но тут нужно именно либо VBS/PHP/JAVA.

Спасиб.

P.S. А ошибки, как раз и появляются тогда когда уверовал в то что все делаеш без ошибок... Сам переодически страдаю :))))

P.s.2 подошол первый вариант, вывода.

Iska
24-12-2012, 12:31
P.S. А ошибки, как раз и появляются тогда когда уверовал в то что все делаеш без ошибок... Сам переодически страдаю ))) »
В том-то и дело, что ошибок не было. Я сделал, запустил, проверил несколько раз, скопировал код, вставил в сообщение. Как в последовательности Ctrl-A, Ctrl-Insert, Alt-Tab, Alt-W (вставка буфера обмена и обрамление тэгом «code») могла пропасть функция — не представляю. Но оказалось именно так. Увы.




© OSzone.net 2001-2012