Создание BAR-файла на основе заданного набора ярлыков

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
A.N.T.
Сообщения: 190
Зарегистрирован: Сб июл 01, 2006 08:50

Сообщение A.N.T. »

Batya как успехи??? Реально ли вообще сделать, то что я хочу?
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

A.N.T. писал(а):Batya как успехи??? Реально ли вообще сделать, то что я хочу?
Не так быстро. Ведь помимо хобби есть еще и работа :)
Твое желание вполне реально.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Получилось примерно так - *.vbs:

Код: Выделить всё

'=======================================================================================
' Создание в каталоге TC панели, содержащей Главное меню (Start Menu)
' Для вызова из TC необходимо в качестве параметра передать число:
'   0   - скрипт отработает один раз
'   > 0 - скрипт будет висеть в памяти и обновлять панель через данное число миллисекунд
' При вызове скрипта без параметра будет изменено значение ключа в реестре,
'   что остановит работу скрипта, висящего в памяти
'=======================================================================================
Option Explicit
Dim MyKey, WSH, StartMenuFile, FolderIconFile
Set WSH = WScript.CreateObject("WScript.Shell")
'========== Изменяемые параметры =======================================================
MyKey   = "HKCU\Software\BatyaSoft\RunningMyScript" 'Ключ в реестре
StartMenuFile  = "startmenu.bar"                    'Имя файла панели
FolderIconFile = "%COMMANDER_PATH%\TOTALCMD.EXE,1"  'Иконка для папок на панели
'=======================================================================================
If WScript.Arguments.Count = 0 Then
  WSH.RegWrite MyKey, "False"
  Set WSH = Nothing
  WScript.Quit
End If
If IsNumeric(WScript.Arguments(0)) = True Then
  If WScript.Arguments(0) = 0 Then
    ScanningStartMenu
  End If
  If WScript.Arguments(0) > 0 Then
    Dim MykeyValue
    MykeyValue = True
    WSH.RegWrite MyKey, MykeyValue
    Do While MykeyValue
      ScanningStartMenu
      WScript.Sleep WScript.Arguments(0)
      MykeyValue = WSH.RegRead(MyKey)
    Loop
  End If
End If

Set WSH = Nothing
WScript.Quit

Function ScanningStartMenu
Dim FSO, F, AUSM, CUSM, i, Menu, Buffer, Lnk
Const ForWriting = 2
Set FSO = CreateObject("Scripting.FileSystemObject")
Set AUSM = FSO.GetFolder(WSH.ExpandEnvironmentStrings("%ALLUSERSPROFILE%") & "\Start Menu\Programs")
Set CUSM = FSO.GetFolder(WSH.ExpandEnvironmentStrings("%USERPROFILE%")     & "\Start Menu\Programs")
i = 0
Buffer = ""
For Each Menu in AUSM.SubFolders
  i = i + 1
  Buffer = Buffer & vbCrLf & "button" & i & "="    & FolderIconFile 
  Buffer = Buffer & vbCrLf & "cmd"    & i & "=cd " & Menu.Path
  Buffer = Buffer & vbCrLf & "menu"   & i & "="    & Menu.Name
Next
For Each Menu in CUSM.SubFolders
  i = i + 1
  Buffer = Buffer & vbCrLf & "button" & i & "="    & FolderIconFile 
  Buffer = Buffer & vbCrLf & "cmd"    & i & "=cd " & Menu.Path
  Buffer = Buffer & vbCrLf & "menu"   & i & "="    & Menu.Name
Next
For Each Menu in AUSM.Files
  If LCase(FSO.GetExtensionName(Menu.Path)) = "lnk" Then
    Set Lnk = WSH.CreateShortcut(Menu.Path)
    i = i + 1
    If Lnk.IconLocation <> ",0" Then
      Buffer = Buffer & vbCrLf & "button" & i & "=" & Lnk.IconLocation
    Else
      Buffer = Buffer & vbCrLf & "button" & i & "=" & Lnk.TargetPath
    End If    
    Buffer = Buffer & vbCrLf   & "cmd"    & i & "=" & Menu.Path
    Buffer = Buffer & vbCrLf   & "menu"   & i & "=" & FSO.GetBaseName(Menu.Path)
    If Lnk.WorkingDirectory <> "" Then
      Buffer = Buffer & vbCrLf & "path"   & i & "=" & Lnk.WorkingDirectory
    End If
  End If
Next
For Each Menu in CUSM.Files
  If LCase(FSO.GetExtensionName(Menu.Path)) = "lnk" Then
    Set Lnk = WSH.CreateShortcut(Menu.Path)
    i = i + 1
    If Lnk.IconLocation <> ",0" Then
      Buffer = Buffer & vbCrLf & "button" & i & "=" & Lnk.IconLocation
    Else
      Buffer = Buffer & vbCrLf & "button" & i & "=" & Lnk.TargetPath
    End If    
    Buffer = Buffer & vbCrLf   & "cmd"    & i & "=" & Menu.Path
    Buffer = Buffer & vbCrLf   & "menu"   & i & "=" & FSO.GetBaseName(Menu.Path)
    If Lnk.WorkingDirectory <> "" Then
      Buffer = Buffer & vbCrLf & "path"   & i & "=" & Lnk.WorkingDirectory
    End If
  End If
Next

Buffer = "[Buttonbar]" & vbCrLf & "Buttoncount=" & i & Buffer 
Set F  = FSO.OpenTextFile(WSH.ExpandEnvironmentStrings("%COMMANDER_PATH%") & "\" & StartMenuFile, ForWriting, True)
F.Write Buffer  
F.Close 
Set Menu = Nothing
Set F    = Nothing
Set AUSM = Nothing
Set CUSM = Nothing
Set FSO  = Nothing
End Function
Аватара пользователя
A.N.T.
Сообщения: 190
Зарегистрирован: Сб июл 01, 2006 08:50

Сообщение A.N.T. »

ИИИИХХХХХАААААААА!!!!!! Супер, ТО что нужно .. Спасибо тебе боооооооооооольшое Батя!!!! Вапще крсота...!!!8)

Скажи, а можно ли тоже самое провернуть только для определённой папки...
Скажем у меня есть папка E:\games\ - в этой папке ярлыки к играм.., ВОТ чтобы тоже генерился бар и всё содержимое этой папки, добавлял также в bar, но только чтобы значки были разные( свои для каждого ярлыка)?
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Легко.

Код: Выделить всё

'======================================================================================= 
' Создание в каталоге TC панели, содержащей ярлыки из указанной папки 
' Для вызова из TC необходимо в качестве параметра передать число: 
'   0   - скрипт отработает один раз 
'   > 0 - скрипт будет висеть в памяти и обновлять панель через данное число миллисекунд 
' При вызове скрипта без параметра будет изменено значение ключа в реестре, 
'   что остановит работу скрипта, висящего в памяти 
'======================================================================================= 
Option Explicit 
Dim MyKey, WSH, MyBarFile, MyLnkFolder 
Set WSH = WScript.CreateObject("WScript.Shell") 
'========== Изменяемые параметры ======================================================= 
MyKey       = "HKCU\Software\BatyaSoft\RunningMyScript" 'Ключ в реестре 
MyBarFile   = "games.bar"                               'Имя файла панели
MyLnkFolder = "E:\games"                                'Папка с ярлыками
'======================================================================================= 
If WScript.Arguments.Count = 0 Then 
  WSH.RegWrite MyKey, "False" 
  Set WSH = Nothing 
  WScript.Quit 
End If 
If IsNumeric(WScript.Arguments(0)) = True Then 
  If WScript.Arguments(0) = 0 Then 
    ScanningMyLnkFolder 
  End If 
  If WScript.Arguments(0) > 0 Then 
    Dim MykeyValue 
    MykeyValue = True 
    WSH.RegWrite MyKey, MykeyValue 
    Do While MykeyValue 
      ScanningMyLnkFolder 
      WScript.Sleep WScript.Arguments(0) 
      MykeyValue = WSH.RegRead(MyKey) 
    Loop 
  End If 
End If 

Set WSH = Nothing 
WScript.Quit 

Function ScanningMyLnkFolder 
Dim FSO, F, Games, i, LnkFile, Buffer, Lnk 
Const ForWriting = 2 
Set FSO = CreateObject("Scripting.FileSystemObject") 
i = 0 
Buffer = "" 
For Each LnkFile in FSO.GetFolder(MyLnkFolder).Files 
  If LCase(FSO.GetExtensionName(LnkFile.Path)) = "lnk" Then 
    Set Lnk = WSH.CreateShortcut(LnkFile.Path) 
    i = i + 1 
    If Lnk.IconLocation <> ",0" Then 
      Buffer = Buffer & vbCrLf & "button" & i & "=" & Lnk.IconLocation 
    Else 
      Buffer = Buffer & vbCrLf & "button" & i & "=" & Lnk.TargetPath 
    End If    
    Buffer = Buffer & vbCrLf   & "cmd"    & i & "=" & LnkFile.Path 
    Buffer = Buffer & vbCrLf   & "menu"   & i & "=" & FSO.GetBaseName(LnkFile.Path) 
    If Lnk.WorkingDirectory <> "" Then 
      Buffer = Buffer & vbCrLf & "path"   & i & "=" & Lnk.WorkingDirectory 
    End If 
  End If 
Next 

Buffer = "[Buttonbar]" & vbCrLf & "Buttoncount=" & i & Buffer 
Set F  = FSO.OpenTextFile(WSH.ExpandEnvironmentStrings("%COMMANDER_PATH%") & "\" & MyBarFile, ForWriting, True) 
F.Write Buffer  
F.Close 
Set Lnk     = Nothing 
Set LnkFile = Nothing 
Set F       = Nothing 
Set FSO     = Nothing 
End Function
Только я, изменив для красоты исходный код, этот кусок не отлаживал. Пиши, если будет ругаться.
Последний раз редактировалось Batya Чт июл 06, 2006 14:55, всего редактировалось 1 раз.
Аватара пользователя
A.N.T.
Сообщения: 190
Зарегистрирован: Сб июл 01, 2006 08:50

Сообщение A.N.T. »

Строка: 59
Символ: 7
Ошибка: Объект не поддерживает это свойство или метод: 'LnkFile.WorkingDirectory'
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Сорри, должно быть Lnk.WorkingDirectory.
Предыдущий пост поправил.
Аватара пользователя
A.N.T.
Сообщения: 190
Зарегистрирован: Сб июл 01, 2006 08:50

Сообщение A.N.T. »

Даааа! Batya ты крут..8) спасибоооо больШое. Не сочти за наглость :) Но если не затруднит, может подредактиш первый скрипт "главное меню", что бы он помимо папок показывал ещё ярлыки которые в корне папки"ГЛАВНОЕ МЕНЮ" с соответствующими им значками...
ЗАРАНЕЕ СПАСИБО!!!!
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Код: Выделить всё

'=======================================================================================
' Создание в каталоге TC панели, содержащей Главное меню (Start Menu)
' Для вызова из TC необходимо в качестве параметра передать число:
'   0   - скрипт отработает один раз
'   > 0 - скрипт будет висеть в памяти и обновлять панель через данное число миллисекунд
' При вызове скрипта без параметра будет изменено значение ключа в реестре,
'   что остановит работу скрипта, висящего в памяти
'=======================================================================================
Option Explicit
Dim MyKey, WSH, StartMenuFile, FolderIconFile
Set WSH = WScript.CreateObject("WScript.Shell")
'========== Изменяемые параметры =======================================================
MyKey   = "HKCU\Software\BatyaSoft\RunningMyScript" 'Ключ в реестре
StartMenuFile  = "startmenu.bar"                    'Имя файла панели
FolderIconFile = "%COMMANDER_PATH%\TOTALCMD.EXE,1"  'Иконка для папок на панели
'=======================================================================================
If WScript.Arguments.Count = 0 Then
  WSH.RegWrite MyKey, "False"
  Set WSH = Nothing
  WScript.Quit
End If
If IsNumeric(WScript.Arguments(0)) = True Then
  Dim FSO, i, Menu, Buffer, Lnk
  If WScript.Arguments(0) = 0 Then
    ScanningStartMenu
  End If
  If WScript.Arguments(0) > 0 Then
    Dim MykeyValue
    MykeyValue = True
    WSH.RegWrite MyKey, MykeyValue
    Do While MykeyValue
      ScanningStartMenu
      WScript.Sleep WScript.Arguments(0)
      MykeyValue = WSH.RegRead(MyKey)
    Loop
  End If
End If

Set WSH = Nothing
WScript.Quit

Function ScanningStartMenu
  Dim F, AUSM, CUSM, AUMM, CUMM
  Const ForWriting = 2
  Set FSO = CreateObject("Scripting.FileSystemObject")
  Set AUSM = FSO.GetFolder(WSH.ExpandEnvironmentStrings("%ALLUSERSPROFILE%") & "\Start Menu\Programs")
  Set CUSM = FSO.GetFolder(WSH.ExpandEnvironmentStrings("%USERPROFILE%")     & "\Start Menu\Programs")
  Set AUMM = FSO.GetFolder(WSH.ExpandEnvironmentStrings("%ALLUSERSPROFILE%") & "\Start Menu")
  Set CUMM = FSO.GetFolder(WSH.ExpandEnvironmentStrings("%USERPROFILE%")     & "\Start Menu")
  i = 0
  Buffer = ""
  For Each Menu in AUMM.Files
    ProcessFile
  Next
  For Each Menu in CUMM.Files
    ProcessFile
  Next
  For Each Menu in AUSM.SubFolders
    ProcessFolder
  Next
  For Each Menu in CUSM.SubFolders
    ProcessFolder
  Next
  For Each Menu in AUSM.Files
    ProcessFile
  Next
  For Each Menu in CUSM.Files
    ProcessFile
  Next
  
  Buffer = "[Buttonbar]" & vbCrLf & "Buttoncount=" & i & Buffer 
  Set F  = FSO.OpenTextFile(WSH.ExpandEnvironmentStrings("%COMMANDER_PATH%") & "\" & StartMenuFile, ForWriting, True)
  F.Write Buffer  
  F.Close 
  Set Menu = Nothing
  Set F    = Nothing
  Set AUSM = Nothing
  Set CUSM = Nothing
  Set FSO  = Nothing
End Function

Function ProcessFolder
  i = i + 1
  Buffer = Buffer & vbCrLf & "button" & i & "="    & FolderIconFile 
  Buffer = Buffer & vbCrLf & "cmd"    & i & "=cd " & Menu.Path
  Buffer = Buffer & vbCrLf & "menu"   & i & "="    & Menu.Name
End Function

Function ProcessFile
  If LCase(FSO.GetExtensionName(Menu.Path)) = "lnk" Then
    Set Lnk = WSH.CreateShortcut(Menu.Path)
    i = i + 1
    If Lnk.IconLocation <> ",0" Then
      Buffer = Buffer & vbCrLf & "button" & i & "=" & Lnk.IconLocation
    Else
      Buffer = Buffer & vbCrLf & "button" & i & "=" & Lnk.TargetPath
    End If    
    Buffer = Buffer & vbCrLf   & "cmd"    & i & "=" & Menu.Path
    Buffer = Buffer & vbCrLf   & "menu"   & i & "=" & FSO.GetBaseName(Menu.Path)
    If Lnk.WorkingDirectory <> "" Then
      Buffer = Buffer & vbCrLf & "path"   & i & "=" & Lnk.WorkingDirectory
    End If
  End If
End Function
Решил, что логичнее, если иконки из корня главного меню будут лежать в начале.
Аватара пользователя
A.N.T.
Сообщения: 190
Зарегистрирован: Сб июл 01, 2006 08:50

Сообщение A.N.T. »

Странно, у меня они всё равно в самом низу, но это не совсем не портит основной картины :D Кстаи не знаеш как можно на одну кнопку повесить сразу три команды cm_RereadSource Shortcut.vbs 0
Startmenu.vbs 0 без использования батника
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Лучше скажи, зачем тебе это надо.
Аватара пользователя
A.N.T.
Сообщения: 190
Зарегистрирован: Сб июл 01, 2006 08:50

Сообщение A.N.T. »

Что бы запускались два твоих СУПЕР!! скрипта + обновлялась панель тотала..
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

А зачем обновлять-то? Ты что, меняешь DEFAULT.BAR?
Но командой cm_RereadSource ты обновления панелей инструментов не добьешься.
Аватара пользователя
A.N.T.
Сообщения: 190
Зарегистрирован: Сб июл 01, 2006 08:50

Сообщение A.N.T. »

:arrow:
Последний раз редактировалось A.N.T. Чт июл 13, 2006 17:54, всего редактировалось 3 раза.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Ты хочешь оба скрипта сразу запускать?
Это можно сделать третьим скриптом. А для обновления есть хитрый способ. Ты ведь кнопкой хочешь запускать скрипты?
Ответить