Страница 1 из 1

Создание ярлыков выделенных файлов ассоциированн. программой

Добавлено: Чт сен 09, 2010 12:28
Andrey_A
Столкнулся с такой проблемой
Заметил, что создавая ярлыки для некоторых файлов обычными способами, они на рабочем столе и в проводнике просто не работают, потому что в системе эти файлы не ассоциированы
Давно пользуюсь написанным для этого скриптом (я его немного уменьшил)

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

'====================================================================== 
' Создание ярлыков выделенных файлов ассоциированной программой
' Параметры: {файл-список} {целевая папка}
' Пример параметров вызова из TC: %L "%T"
' Автор Andrey_A 
'====================================================================== 
Option Explicit
Dim FSO, TCS, ListFile, SelFile, Path, TPath, i, k, m, n, sym, Ext, Dir, Name, Argument, WD, Icon, link, Shell
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Shell = CreateObject("WScript.Shell")
Set TCS = CreateObject("TCSCRIPT.Helper")
Set ListFile = FSO.OpenTextFile(WScript.Arguments(0), 1)
TPath  = WScript.Arguments(1) 
  
Do While Not ListFile.AtEndOfStream
     SelFile = ListFile.ReadLine
  
Argument = """" & SelFile & """"
Dir = SelFile
WD = ""
Icon = Dir & ",0"

' Извлекаем расширение
 For k = 0 To Len(SelFile) 
    sym = Mid(SelFile,Len(SelFile) - k,1) 
       If sym = "." Then
             m = Len(SelFile) - k + 1
             k = Len(SelFile)
       end if
  Next 
Ext = ""
  For i = m To Len(SelFile)
              Ext = Ext & Mid(SelFile,i,1)
  Next      
     
     ' Извлекаем имя
 For k = 0 To Len(SelFile) 
    sym = Mid(SelFile,Len(SelFile) - k,1) 
       If sym = "\" Then
             n = Len(SelFile) - k + 1
             k = Len(SelFile)
       end if
  Next 
Name = ""
  For i = n To m - 2
              Name = Name & Mid(SelFile,i,1)
  Next    
  

If Ext = "djvu" or Ext = "Djvu" or Ext = "DJVU" or Ext = "djv" or Ext = "Djv" or Ext = "DJV" Then
    Dir = "%COMMANDER_PATH%\Programs\Text\WinDjView\WinDjView.exe"
    WD = "%COMMANDER_PATH%\Programs\Text\WinDjView\"
    Icon = "%COMMANDER_PATH%\Wcmicons.dll,736"
    Name = "Книга " & Name
End If

If Ext = "CHm" or Ext = "Chm" or Ext = "chm" or Ext = "CHM" Then
   Dir = "%COMMANDER_PATH%\Utilities\Systems\WinHlp\hh.exe"
  WD = "%COMMANDER_PATH%\Utilities\Systems\WinHlp\"
  Icon = "%COMMANDER_PATH%\Wcmicons.dll,590"
  Name = "Справка " & Name
End If

 If Ext = "Pdf" or Ext = "PDF" or Ext = "PdF" or Ext = "PDf" or Ext = "pDf" or Ext = "pdF" or Ext = "pDF" or Ext = "pdf" Then
 Dir = "%COMMANDER_PATH%\Programs\Text\Foxit_Reader\Foxit Reader.exe"
WD = "%COMMANDER_PATH%\Programs\Text\Foxit_Reader\"
Icon = "%COMMANDER_PATH%\Wcmicons.dll,1823"
End If

' Создаём ярлык
Set link = Shell.CreateShortcut(TPath & "\" & Name &".lnk")
link.Arguments = Argument
link.Description = Argument
link.IconLocation = Icon
link.TargetPath = Dir
link.WindowStyle = 1
link.WorkingDirectory = WD
link.Save

Loop

   ListFile.Close
   Set ListFile = Nothing
   Set FSO = Nothing
   WScript.Quit
Тут есть несколько моментов с которыми сам не справлюсь и поэтому хотел попросить помощи у профессионалов

1. Подправить скрипт... (есть ли функция где Ext читался без регистра, просто длинно получается - я встречал файлы где расширения были CHM, chm, Chm и даже cHm - и так со всеми различными расширениями файлов)

2. В скрипте есть блок для определённого типа файлов (к примеру)

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

If Ext = "CHm" or Ext = "Chm" or Ext = "chm" or Ext = "CHM" Then
   Dir = "%COMMANDER_PATH%\Utilities\Systems\WinHlp\hh.exe"
  WD = "%COMMANDER_PATH%\Utilities\Systems\WinHlp\"
  Icon = "%COMMANDER_PATH%\Wcmicons.dll,590"
  Name = "Справка " & Name
End If
Можно ли попробовать создать другой скрипт, который бы сканировал секцию [Associations] и, находя расширения, брал информацию и вставлял бы блок для каждого из них в этот скрипт. Тем самым получился бы скрипт, создающий ярлыки открывающие файл нужной нам программой. Я думаю, что это пригодится не только мне
Спасибо заранее за понимание

Добавлено: Чт сен 09, 2010 14:19
Batya
1.
Andrey_A писал(а):If Ext = "CHm" or Ext = "Chm" or Ext = "chm" or Ext = "CHM" Then

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

If UCase(Ext) = "CHM" Then
2. А зачем париться с реестром? Если уже ассоциировано, то и запустится ассоциированное приложение при запуске файла.

Добавлено: Чт сен 09, 2010 15:05
Andrey_A
Batya спасибо за совет с UCase(Ext) , а что касается реестра, я про него ничего не говорил, более того у меня реестр почти пуст - т.е. ни один файл не ассоциирован, говоря о [Associations] , я имел ввиду секцию в wincmd.ini . Ещё раз пример: под курсором файл ...avi , нажимаю ctrl+Shift+F5 - создаётся ярлык, который открывается каким-то плеером

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

Target:			E:\Фильмы\Cherepa\Cherepa_1.avi
Arguments:		
Working folder:	E:\Фильмы\Cherepa
Shortcut key:		No
Window:		Normal
Comments:		E:\Фильмы\Cherepa\Cherepa_1.avi
Path to icon:		Not specified
а мне надо "моим" плеером

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

Target:			C:\Total Commander Image\Programs\Players\VLC\Vlc.exe
Arguments:		"E:\Фильмы\Cherepa\Cherepa_1.avi"
Working folder:	%COMMANDER_PATH%\Programs\Players\VLC\
Shortcut key:		No
Window:		Normal
Comments:		"E:\Фильмы\Cherepa\Cherepa_1.avi"
Path to icon:		%COMMANDER_PATH%\Wcmicons.dll
			icon number: 576
и никакого реестра

Добавлено: Чт сен 09, 2010 15:29
Lev
[off]Посмотри ext.vbs от Script Content Plugin и объедини If'ы в Case по образцу. Чем больше вероятность встречи данного расширения в твоей работе тем раньше его проверяешь.
Это примерно равнозначно вставке в твои If'ы GoTo на конец блока If'ов, чтобы уже не проверять расширения если оно уже определилось и обработано[/off]

Добавлено: Чт сен 09, 2010 16:24
Batya
Andrey_A писал(а):говоря о [Associations] , я имел ввиду секцию в wincmd.ini
Ааа... Опять тороплюсь.
Наверное, можно. Только я в ближайшее время за это браться не буду точно. Со временем очень сложно.

Кстати, ещё совет - для определения расширения и имени файла без расширения лучше использовать соответствующие методы объекта FSO:

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

FSO.GetBaseName(path)
FSO.GetExtensionName(path)

Добавлено: Ср окт 06, 2010 02:09
Andrey_A
Обложился различными справками по скриптам и решил задачу самостоятельно, пользуюсь уже неделю, вроде бы всё работает...

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

'===================================================================================== 
' Создание ярлыков ВЫДЕЛЕННЫХ файлов, связанных с Программой , ассоциированной в Total Commander
 '
' В параметрах вызова из TC должно быть прописанo ТРИ параметра: 
' {Файл Список} {Файл\Секция Ассоциаций} {Путь сохранения ярлыка}
'
' ============== Параметр №1 {Файл Список} ==================================================
'
' 		Должно быть прописано %L либо Путь\к_файл_списку_открываемых_файлов.txt
'
' ============== Параметр №2 {Файл\Секция Ассоциаций} ===============================================
'
' 		Ассоциации прописаны в секции [Associations]
' 		Для корректной работы секцию рекомендуется вынести из файла Wincmd.ini , прописав в нём
' [Associations]
' RedirectSection=WinAssociations.ini
'
' 		Можно составить СВОЙ ФАЙЛ АССОЦИАЦИЙ, вне файла Wincmd.ini где синтаксис будет таким же как и в секции [Associations]  (без строки значков)
'
' Filter1=*.TXT;*.inc;
' Filter1_open=""%COMMANDER_PATH%\Plugins\exe\AkelPad\AkelPad.exe" "%1""
' Filter2=*.JPG;*.bmp;
' Filter2_open=""%COMMANDER_PATH%\Plugins\wlx\Imagine\Imagine.exe" "%1""
'
' 		Важно!!! После расширения, даже если оно одно добавлять {;} (точку с запятой) т.е.  Filter1=*.TXT;
'
'============== Параметр №3  {Путь сохранения ярлыка } ===============================
'
'             Должно быть прописано "%T" либо "%P" либо "Путь\сохранения\ярлыка\"

'============== Примеры ===================================================================
'
'  %L "%%COMMANDER_PATH%%\WinAssociations.ini" "%T"
'  %L "%%COMMANDER_PATH%%\Wincmd.ini" "%P"
'  %L "%%COMMANDER_PATH%%\UserAssociations_1.txt" "%APPDATA%\Microsoft\Internet Explorer\Quick Launch"
' "%%COMMANDER_PATH%%\ListFiles.txt" "%%COMMANDER_PATH%%\UserAssociations_2.txt" "%%HOMEPATH%%\Desktop\"
'
' Автор:             Аверин Андрей (28.09.2010)
' Версия:          1.6
'====================================================================== 
Option Explicit
Dim FSO, ListFile, SelFile, TPath, Ass, ListAss, Stroka, Target, F, i, m, Ext, ExtAss, Name, Arguments, WorkingFolder, Icon, link, Shell, TPathN,Description
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Shell = CreateObject("WScript.Shell")

Set ListFile = FSO.OpenTextFile(WScript.Arguments(0), 1)
TPath  = WScript.Arguments(2) 
TPath = FSO.GetAbsolutePathName(CreateObject("WScript.Shell").ExpandEnvironmentStrings(TPath))

Do While Not ListFile.AtEndOfStream
     SelFile = ListFile.ReadLine
  
Name = FSO.GetBaseName(SelFile) 
Ext = FSO.GetExtensionName(SelFile)                           ' Извлекаем расширение файла
ExtAss = UCase("*." & Ext & ";")                                      ' Готовим строку для поиска в ассоциациях

TPathN = TPath & "\" & Name & "." & Ext & ".lnk" ' Параметры ярлыка по умолчанию
Arguments =  ""
Target = SelFile
Icon = Target & ",0"
 	
           If FSO.FolderExists(SelFile) Then                          ' Если выделена папка
           Target = SelFile
           Icon = ",0"
           TPathN = TPath & "\" & Name & "." & "lnk"
           Description = SelFile
           End if

 		Ass = WScript.Arguments(1)
		Ass = FSO.GetAbsolutePathName(CreateObject("WScript.Shell").ExpandEnvironmentStrings(Ass))
		ListAss =  Split(FSO.OpenTextFile(Ass).ReadAll, vbNewLine) 
			i = 0
			m = 0
     For Each F In ListAss
		  		
	If F <> "" or Ext <> "" Then 
	
	  	If  InStr(1,ListAss(i),"|") > 1 Then 
	  		Stroka = UCase(Left(ListAss(i), InStr(1,ListAss(i),"|")))
	  	Else
	  		Stroka = UCase(ListAss(i))
	  	End If
	  
	  	if m = 0 Then
 		 	if InStr(1,Stroka,ExtAss) > 1 Then  ' Ищем номер строки и затем ассоциированную программу 
 		 		if InStr(1,UCase(ListAss(i+1)),"OPEN") > 1 Then
	 	 			Target = Mid(ListAss(i+1), InStr(1, ListAss(i + 1), chr(34)) + 2 , Len(ListAss(i+1)) - InStr(1, ListAss(i + 1), chr(34)) - 8)
	 	 			TPathN = TPath & "\" & Name & "." & Ext & ".lnk"
	 	 		 	Description = SelFile
	 	 		 	Arguments = Chr(34) & SelFile & Chr(34)
	 	 				If InStr(1,UCase(ListAss(i+2)),"ICON") > 1 Then
	 	 		  			Icon = Mid(ListAss(i+2), InStr(1, ListAss(i + 2), "=") + 1 , Len(ListAss(i+2)) - InStr(1, ListAss(i + 2), "="))
	 	 				End If
	 	 		End if
 				m = 1
	 		End if
 		End if
 		i = i + 1
	End If
    Next

WorkingFolder = FSO.GetParentFolderName(Target)
Set link = Shell.CreateShortcut(TPathN) ' Создаём ярлык
link.Arguments = Arguments
link.Description = Description
link.IconLocation = icon
link.TargetPath = Target
link.WindowStyle = 1
link.WorkingDirectory = WorkingFolder
link.Save

Loop
   ListFile.Close
   Set ListFile = Nothing
   Set FSO = Nothing
   WScript.Quit
Может кому-то тоже пригодится