1 (изменено: Alexey, 2009-07-17 01:16:51)

Тема: VBS: информация о версии всех плагинов Total Commander

Когда то возникла необходимость вытащить subj , тогда и родился этот нехитрый скрипт.
Может кому пригодится...
Скрипт читает файл wincmd.ini сначала в папке %windir%, если его там нет то в папке запущенного Total Commander'а,
регулярным выражением выбирает имена файлов-плагинов и собирает с них информацию при помощи objShellApp.NameSpace(folder).
Вся солянка наливается в Excel.

 
'проверка на один запуск
On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
    WScript.Echo Err.Number & ": " & Err.Description
    WScript.Quit
End If
QueryText = "SELECT * FROM Win32_Process WHERE CommandLine LIKE '%" & WScript.ScriptName & "%'"
Set colProc = objService.ExecQuery(QueryText)
If colProc.Count > 1 Then
    WScript.Echo "Скрипт уже запущен"
    WScript.Quit
End If

Set objRegExp = CreateObject("VBScript.RegExp")
Set fso = CreateObject("scripting.filesystemobject")
set WshShell = CreateObject("wscript.Shell")
Set objShellApp = CreateObject("Shell.Application")
Set xlApp = CreateObject("Excel.Application") 
xlApp.Visible = True
xlApp.Workbooks.Add    
xlApp.Cells(1, 1).Value = "FileName"
xlApp.Cells(1, 2).Value = "Description"
xlApp.Cells(1, 3).Value = "Version"
xlApp.Cells(1, 4).Value = "Version2"

objRegExp.IgnoreCase = 1
objRegExp.Global = 1
'проверяем запущенность Total Commander
On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
    WScript.Echo Err.Number & ": " & Err.Description
    WScript.Quit
End If
'ищу в памяти Total ((TOTAL)|(WIN)) commander
objRegExp.Pattern = "((TOTAL)|(WIN))CMD??.EXE"
For Each objProc In objService.ExecQuery("SELECT * FROM Win32_Process")
    If objRegExp.Test(objProc.Caption) Then Exit For
Next

'читаем wincmd.ini
objRegExp.Pattern=objProc.Caption
If Not fso.FileExists(WshShell.ExpandEnvironmentStrings("%WINDIR%")&"\wincmd.ini") Then
    Set fileFSO = fso.OpenTextFile(objRegExp.Replace(objProc.ExecutablePath,"wincmd.ini"))
Else
    Set fileFSO = fso.OpenTextFile(WshShell.ExpandEnvironmentStrings("%WINDIR%")&"\wincmd.ini")
End If

ini = fileFSO.ReadAll
'если используется %COMMANDER_PATH% то подтигиваем %COMMANDER_PATH%=InstallDir
objRegExp.Pattern="%COMMANDER_PATH%.*"
CommanderPath=""
If objRegExp.Test(ini) Then
    objRegExp.Pattern="InstallDir=.*"
    Set matches=objRegExp.Execute(ini)
    CommanderPath=Replace(matches(0).value,"InstallDir=","")
    'убираю перевод строки в конце
    CommanderPath=Left(CommanderPath,Len(CommanderPath)-1)
End If
'выбираем плагины
objRegExp.Pattern="[-+~!#$%^&()@:\s\\\w\%а-я]+\\plugins.*w.x"
Set matches=objRegExp.Execute(ini)

i=2
'находим plugins


For Each Match in matches      ' Iterate Matches collection.
    
    'если есть переменные окружения выставляем их
    full_path=WshShell.ExpandEnvironmentStrings(Match.value)
    If CommanderPath<>"" Then full_path=Replace(full_path,"%COMMANDER_PATH%",CommanderPath)
    'имя папки
    objRegExp.Pattern=".*\\"
    Set matches2=objRegExp.Execute(full_path)
        For Each Match2 in matches2      ' Iterate Matches collection.
            folder=Match2.value            
        Next
    'имя файла
    objRegExp.Pattern="\w+\..*"
    Set matches2=objRegExp.Execute(full_path)
        For Each Match2 in matches2      ' Iterate Matches collection.
            filename=Match2.value
        Next
        
    Set objFolder = objShellApp.NameSpace(folder)
    Set objItem = objFolder.ParseName(filename)
    
    xlApp.Cells(i, 1).Value = full_path
    'xlApp.Cells(i, 2).Value = filename
    xlApp.Cells(i, 2).Value = objFolder.GetDetailsOf(objItem, 37)    
    xlApp.Cells(i, 3).Value = objFolder.GetDetailsOf(objItem, 38)
    xlApp.Cells(i, 4).Value = objFolder.GetDetailsOf(objItem, 40)
    i=i+1
Next
WScript.Quit