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

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

andr_mozg 18-12-2012 14:56 2048036

скрипт: перечень сервисов и статусов, как поправить кодировку и отсортировать?
 
Скрипт выглядит так
Код:

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 2048144

Цитата:

Цитата andr_mozg
руские буквы отображатет некоректно, »

Где отображает?

Цитата:

Цитата andr_mozg
как поменять на 1251 кодировку »

Где менять, зачем менять?

Цитата:

Цитата andr_mozg
и отсортировать по именам сервисов? »

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

andr_mozg 18-12-2012 21:38 2048352

скрипт отрабатывает на удаленной машине с Русской виндой.
при выводе русские буквы отображаются криво.

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

Iska 19-12-2012 01:42 2048489

Цитата:

Цитата andr_mozg
скрипт отрабатывает на удаленной машине с Русской виндой. при выводе русские буквы отображаются криво. »

Как? Так?
Код:

strComputer = "RemoteMachineName"
Покажите скриншот. Разницы не должно быть, независимо от того, на локальной (".") или удалённой ("RemoteMachineName") машинах сие происходит.

Цитата:

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

Например, так:
читать дальше »
Код:

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 2048548

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

Iska 19-12-2012 07:29 2048560

andr_mozg, прямо ответьте на вопрос — Вы указываете имя/адрес удалённой машины здесь:
Код:

strComputer = "RemoteMachineName"
?

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

andr_mozg 19-12-2012 09:52 2048619

нет. скрипт запускается тот что в первом посте. он запускается локально но ответ возвращает агент обратно.

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

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

Iska 19-12-2012 10:46 2048658

Что такое «агент»? Почему не используете указанный способ подключения?

andr_mozg 19-12-2012 11:11 2048673

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

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

Iska 19-12-2012 15:09 2048898

Понятно. Что или Вы знать не знаете, или не хотите сказать — ни что за «агент», ни привести скриншот.

andr_mozg 19-12-2012 15:20 2048912

Вложений: 1
я знаю что за агент но думаю что ВАМ это не скажет не очем, и скриншот непонятно зачем.

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

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

Iska 19-12-2012 17:21 2049025

Цитата:

Цитата andr_mozg
я знаю что за агент но думаю что ВАМ это не скажет не очем, »

Скажет.

Цитата:

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

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

Я ж волшебник :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 2049187

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

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

Iska 20-12-2012 05:22 2049412

Цитата:

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

Особо комментировать-то там и нечего.

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

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

andr_mozg 21-12-2012 12:08 2050288

пишит что переменная не определена StrConvert

Iska 21-12-2012 15:53 2050405

В этом посте нажмите текст «читать дальше». Откроется спойлер с кодом.

andr_mozg 22-12-2012 12:11 2050856

ну вобщем тот код я и пробовал.
на своей машине запускал и на других, ответ тот же.

Iska 22-12-2012 14:29 2050930

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

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

Вот тот же код вместе с потерянной функцией:
читать дальше »
Код:

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 2052307

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

Спасиб.

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

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

Iska 24-12-2012 12:31 2052356

Цитата:

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

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


Время: 05:39.

Время: 05:39.
© OSzone.net 2001-