#Include <File.au3> #include <WindowsConstants.au3> AutoItSetOption("TrayIconHide", 1) ;скрыть в системной панели индикатор AutoIt Global $Stack[50] Global $Stack1[50] Global $aRecords ; начало создания окна, вкладок, кнопок. GUICreate("Создание ярлыков",468,318, -1, -1, -1, $WS_EX_ACCEPTFILES) ; размер окна $tab=GUICtrlCreateTab (4,5, 460,310) ; размер вкладки GUICtrlCreateLabel ("используйте drag-and-drop", 250,5,200,18) $tab1=GUICtrlCreateTabitem ("LNK") ; имя вкладки GUICtrlCreateLabel ("Имя ярлыка:", 20,38,125,22) GUICtrlSetTip(-1, "Имя ярлыка без расширения") $NME=GUICtrlCreateInput ('', 150,38,295,20) GUICtrlCreateLabel ("Создать ярлык в папке:", 20,71,125,22) GUICtrlSetTip(-1, "Можно указать прямой путь") $DIR=GUICtrlCreateCombo ('', 150,67,295,18) GUICtrlSetData(-1,'текущая|быстрый запуск|рабочий стол|SendTo|главное меню', 'текущая') GUICtrlCreateLabel ("Рабочая папка:", 20,100,125,22) GUICtrlSetTip(-1, "Папка, которая становится текущей"&@CRLF&"для стартующей программы") $WRK=GUICtrlCreateInput ('', 150,100,295,20) GUICtrlCreateLabel ("Полный путь к файлу: *", 20,130,125,22) GUICtrlSetTip(-1, "Путь к файлу запуска (Объект)") $EXE=GUICtrlCreateInput ('', 150,130,295,20) GUICtrlSetState(-1,8) GUICtrlCreateLabel ("Параметры запуска:", 20,160,125,22) GUICtrlSetTip(-1, "Аргумент, ключ") $ARG=GUICtrlCreateInput ('', 150,160,295,20) GUICtrlCreateLabel ("Комментарий:", 20,190,125,22) GUICtrlSetTip(-1, "Подробное описание к программе"&@CRLF&"будущая всплывающая подсказка") $DSC=GUICtrlCreateInput ('', 150,190,295,20) GUICtrlCreateLabel ("Иконка ярлыка:", 20,220,125,22) GUICtrlSetTip(-1, "Если не указана, то по умолчанию"&@CRLF&" первая иконка стартового файла.") $ICO=GUICtrlCreateInput ('', 150,220,295,20) GUICtrlCreateLabel ("Номер иконки:", 20,250,125,22) GUICtrlSetTip(-1, "Указывается для dll, по умолчанию"&@CRLF&"используется первая (отсчёт с нуля)") $NMR=GUICtrlCreateInput ('', 150,250,295,20) $TAK=GUICtrlCreateInput ('', 100,280,30,22) GUICtrlSetState(-1,8) GUICtrlSetTip($TAK, 'Перенести в это поле ярлык или *.exe'&@CRLF&'и нажать "Принять" для автозаполнения') $take_lnk=GUICtrlCreateButton ("Принять", 140,280,70,22) GUICtrlSetTip(-1, "Перенести ярлык или *.exe в поле слева"&@CRLF&"Принять ярлык для чтения его данных"&@CRLF&"и автозаполнения полей") $read_lnk=GUICtrlCreateButton ("Открыть", 220,280,70,22) GUICtrlSetTip(-1, "Открыть ярлык для чтения его данных"&@CRLF&"и автозаполнения полей") $addbase_lnk=GUICtrlCreateButton ("Добавить", 300,280,70,22) GUICtrlSetTip(-1, "Добавить ярлык в файл бэкапа base_lnk.txt") $create_lnk=GUICtrlCreateButton ("Создать", 380,280,70,22) GUICtrlSetTip(-1, "Создать ярлык") $tab2=GUICtrlCreateTabitem ("AUTO") ; имя вкладки ;GUICtrlSetState(-1,16) GUICtrlCreateGroup("Создание бэкапа ярлыков (текстовый файл)", 11, 35, 440, 120) GUICtrlCreateLabel ("Перенести в это поле папку или выделенную группу ярлыков", 20,55,425,22) $lnk_group=GUICtrlCreateInput ('', 20,75,335,20) GUICtrlSetState(-1,8) GUICtrlCreateLabel ("Путь к текстовому бэкап-файлу, по умолчанию base_lnk.txt в папке скрипта", 20,105,425,22) $save_group1=GUICtrlCreateInput ('', 20,125,335,20) GUICtrlSetState(-1,8) GUICtrlSetTip($save_group1, "Перенести в это поле текстовый файл"&@CRLF&"создаётся автоматически") $save_group=GUICtrlCreateButton ("Сохранить", 370,125,70,22) GUICtrlSetTip(-1, "Сохранить ярлыки в бэкап.") GUICtrlCreateGroup("Восстановление ярлыков из бэкапа", 11, 180, 440, 120) GUICtrlCreateLabel ("Путь к текстовому файлу, по умолчанию base_lnk.txt в текущей папке", 20,200,425,22) $base_backup1=GUICtrlCreateInput ('', 20,220,335,20) GUICtrlSetState(-1,8) GUICtrlSetTip($base_backup1, "Перенести в это поле бэкап-файл.") GUICtrlCreateLabel ("Путь к папке, в которой будут созданы ярлыки, иначе путь из бэкап-файла", 20,250,430,22) $restore_lnk=GUICtrlCreateInput ('', 20,270,335,20) GUICtrlSetState(-1,8) GUICtrlSetTip($restore_lnk, "Перенести в это поле папку,"&@CRLF&"в которой нужно создать ярлыки.") $restore_lnk1=GUICtrlCreateButton ("Создать", 370,270,70,22) GUICtrlSetTip(-1, "Создание ярлыков. При наличии"&@CRLF&"base_lnk.txt в папке скрипта"&@CRLF&"поля заполнять не обязательно.") $tab2=GUICtrlCreateTabitem ("?") ; имя вкладки GUICtrlCreateLabel ("Назначение программы", 30,35,400,22) GUICtrlCreateLabel ("1. Содание бэкапа ярлыков.", 20,55,440,22) GUICtrlCreateLabel ("2. Оптимизация ярлыков пересозданием.", 20,75,440,22) GUICtrlCreateLabel ("3. Создание ярлыков для LiveCD при отсутствии объекта ярлыка.", 20,95,440,22) GUICtrlCreateLabel ("Дополнительные возможности", 30,125,400,22) GUICtrlCreateLabel ("1. Автоматическое создание ярлыков (скриптом) из бэкап-файла при загрузке LiveCD.", 20,145,440,22) GUICtrlCreateLabel ("2. Автозамена данных (пути) в бэкап-файле.", 20,165,440,22) GUICtrlCreateLabel ("AZJIO 26.10.2009", 380,270,80,32) GUICtrlCreateTabitem ("") ; конец вкладок GUISetState () While 1 $msg = GUIGetMsg() Select Case $msg = $create_lnk $EXE1=GUICtrlRead ($EXE) If $EXE1<>'' Then $aPath = StringRegExp($EXE1, "(^.*)\\(.*)$", 3) $EXENAME = StringTrimRight($aPath[1], 4) ; чтение параметров из полей ввода $NME1=GUICtrlRead ($NME) If $NME1='' Then $NME1=$EXENAME $DIR1=GUICtrlRead ($DIR) If $DIR1='текущая' Then $DIR1=@ScriptDir If $DIR1='быстрый запуск' Then $DIR1=@AppDataDir&'\Microsoft\Internet Explorer\Quick Launch' If $DIR1='рабочий стол' Then $DIR1=@UserProfileDir&'\Рабочий стол' If $DIR1='SendTo' Then $DIR1=@UserProfileDir&'\SendTo' If $DIR1='главное меню' Then $DIR1=@UserProfileDir&'\Главное меню\Программы' If StringMid($DIR1, 3, 1)=':' Then $DIR1=$DIR $WRK1=GUICtrlRead ($WRK) If $WRK1='' Then $WRK1=$aPath[0] $ARG1=GUICtrlRead ($ARG) $DSC1=GUICtrlRead ($DSC) $ICO1=GUICtrlRead ($ICO) $NMR1=GUICtrlRead ($NMR) $LNK1=$DIR1&'\'&$NME1 FileCreateShortcut($EXE1,$LNK1&'.lnk',$WRK1,$ARG1,$DSC1,$ICO1,'',$NMR1) Else MsgBox(0, "Ошибка", "Минимум параметров - это полный путь к файлу запуска") EndIf Case $msg = $read_lnk $Path_lnk = FileOpenDialog("Выбор файла конфигурации сети.", @WorkingDir & "", "Ярлык (*.lnk)", 1 + 4 ) If @error Then ContinueLoop $aLNK = FileGetShortcut($Path_lnk) $aPathLNK = StringRegExp($Path_lnk, "(^.*)\\(.*)$", 3) $NAME = StringTrimRight($aPathLNK[1], 4) GUICtrlSetData($NME,$NAME) GUICtrlSetData($WRK,$aLNK[1]) GUICtrlSetData($ARG,$aLNK[2]) GUICtrlSetData($DSC,$aLNK[3]) GUICtrlSetData($ICO,$aLNK[4]) GUICtrlSetData($NMR,$aLNK[5]) GUICtrlSetData($EXE,$aLNK[0]) ; Добавить ярлык в бэкап-файл Case $msg = $addbase_lnk $EXE1=GUICtrlRead ($EXE) If $EXE1<>'' Then $aPath = StringRegExp($EXE1, "(^.*)\\(.*)$", 3) $EXENAME = StringTrimRight($aPath[1], 4) ; чтение параметров из полей ввода $NME1=GUICtrlRead ($NME) If $NME1='' Then $NME1=$EXENAME $DIR1=GUICtrlRead ($DIR) If $DIR1='текущая' Then $DIR1=@ScriptDir If $DIR1='быстрый запуск' Then $DIR1=@AppDataDir&'\Microsoft\Internet Explorer\Quick Launch' If $DIR1='рабочий стол' Then $DIR1=@UserProfileDir&'\Рабочий стол' If $DIR1='SendTo' Then $DIR1=@UserProfileDir&'\SendTo' If $DIR1='главное меню' Then $DIR1=@UserProfileDir&'\Главное меню\Программы' If StringMid($DIR1, 3, 1)=':' Then $DIR1=$DIR $WRK1=GUICtrlRead ($WRK) If $WRK1='' Then $WRK1=$aPath[0] $ARG1=GUICtrlRead ($ARG) $DSC1=GUICtrlRead ($DSC) $ICO1=GUICtrlRead ($ICO) $NMR1=GUICtrlRead ($NMR) $LNK1=$DIR1&'\'&$NME1 $filebase = FileOpen(@ScriptDir&'\base_lnk.txt', 1) ; проверка открытия файла для записи строки If $filebase = -1 Then MsgBox(0, "Ошибка", "Не возможно открыть файл.") Exit EndIf If FileGetSize(@ScriptDir&'\base_lnk.txt')=0 Then FileWrite($filebase, $DIR1&'|||') FileWrite($filebase, @CRLF&'; путь от корневой папки и имя ярлыка|объект|рабочая папка|аргумент|комментарий|путь к файлу с иконкой|номер иконки') EndIf FileWrite($filebase, @CRLF&$NME1&'|'&$EXE1&'|'&$WRK1&'|'&$ARG1&'|'&$DSC1&'|'&$ICO1&'|'&$NMR1) FileClose($filebase) Else MsgBox(0, "Ошибка", "Минимум параметров - это полный путь к файлу запуска") EndIf Case $msg = $take_lnk $Path_lnk=GUICtrlRead ($TAK) If $Path_lnk = "" Then ContinueLoop If StringRight( $Path_lnk, 4 ) = ".lnk" Then $aLNK = FileGetShortcut($Path_lnk) $aPathLNK = StringRegExp($Path_lnk, "(^.*)\\(.*)$", 3) $NAME = StringTrimRight($aPathLNK[1], 4) GUICtrlSetData($NME,$NAME) GUICtrlSetData($WRK,$aLNK[1]) GUICtrlSetData($ARG,$aLNK[2]) GUICtrlSetData($DSC,$aLNK[3]) GUICtrlSetData($ICO,$aLNK[4]) GUICtrlSetData($NMR,$aLNK[5]) GUICtrlSetData($EXE,$aLNK[0]) EndIf If StringRight( $Path_lnk, 4 ) = ".exe" Then $aPathLNK = StringRegExp($Path_lnk, "(^.*)\\(.*)$", 3) $NAME = StringTrimRight($aPathLNK[1], 4) GUICtrlSetData($NME,$NAME) GUICtrlSetData($WRK,$aPathLNK[0]) GUICtrlSetData($EXE,$Path_lnk) EndIf ; вкладка auto ; создание бэкапа Case $msg = $save_group $lnk_group1=GUICtrlRead ($lnk_group) ; чтение пути и ярлыков $save_group2=GUICtrlRead ($save_group1) ; чтение пути к текстовому файлу ;если не указан базовый файл бэкапа, то по умолчанию base_lnk.txt в папке скрипта If $save_group2 = '' Then $save_group2=@ScriptDir&'\base_lnk.txt' ;Определяем тип данных ; если в конце LNK или содержит символ "|" но не содержит атрибут "D" то обработать как одиночный ярлык или группу ярлыков If StringRight( $lnk_group1, 4 ) = ".lnk" Or StringInStr($lnk_group1, "|") > 0 And StringInStr(FileGetAttrib($lnk_group1), "D") = 0 Then $lnk_group1 = StringSplit($lnk_group1, "|") For $i=1 To $lnk_group1[0] $aLNK = FileGetShortcut($lnk_group1[$i]) $filebase = FileOpen($save_group2, 1) ; проверка открытия файла для записи строки If $filebase = -1 Then MsgBox(0, "Ошибка", "Не возможно открыть файл.") Exit EndIf $aDirlnk=StringRegExp($lnk_group1[$i], "(^.*)\\(.*)$", 3) If FileGetSize($save_group2)=0 Then FileWrite($filebase, $aDirlnk[0]&'|||') FileWrite($filebase, @CRLF&'; путь от корневой папки и имя ярлыка|объект|рабочая папка|аргумент|комментарий|путь к файлу с иконкой|номер иконки') EndIf $NAME = StringTrimRight($lnk_group1[$i], 4) $NAME = StringTrimLeft($NAME, StringLen($aDirlnk[0]&'\')) FileWrite($filebase, @CRLF&$NAME&'|'&$aLNK[0]&'|'&$aLNK[1]&'|'&$aLNK[2]&'|'&$aLNK[3]&'|'&$aLNK[4]&'|'&$aLNK[5]) FileClose($filebase) Next EndIf ; если содержит атрибут "D" то обработать как каталог If StringInStr(FileGetAttrib($lnk_group1), "D") > 0 Then FileFindNextFirst($lnk_group1) While 1 $tempname = FileFindNext() If $tempname = "" Then ExitLoop If StringRight( $tempname, 3 ) = "lnk" Then $aLNK = FileGetShortcut($tempname) $filebase = FileOpen($save_group2, 1) ; проверка открытия файла для записи строки If $filebase = -1 Then MsgBox(0, "Ошибка", "Не возможно открыть файл.") Exit EndIf If FileGetSize($save_group2)=0 Then FileWrite($filebase, $lnk_group1&'|||') FileWrite($filebase, @CRLF&'; путь от корневой папки и имя ярлыка|объект|рабочая папка|аргумент|комментарий|путь к файлу с иконкой|номер иконки') EndIf $NAME = StringTrimRight($tempname, 4) $NAME = StringTrimLeft($NAME, StringLen($lnk_group1&'\')) FileWrite($filebase, @CRLF&$NAME&'|'&$aLNK[0]&'|'&$aLNK[1]&'|'&$aLNK[2]&'|'&$aLNK[3]&'|'&$aLNK[4]&'|'&$aLNK[5]) FileClose($filebase) EndIf WEnd EndIf ; восстановление из бэкапа Case $msg = $restore_lnk1 $restore_lnk2=GUICtrlRead ($restore_lnk) ; путь к папке ярлыков $base_backup2=GUICtrlRead ($base_backup1) ;текстовый файл ; если не указан бэкап-файл, то используется по умолчанию base_lnk.txt, (содержит путь по умолчанию) If $base_backup2 = '' Then $base_backup2 = (@ScriptDir&'\base_lnk.txt') ; читаем бэкап-файл в массив If Not _FileReadToArray($base_backup2,$aRecords) Then MsgBox(4096,"Ошибка", "Ошибка чтения массива", @error) Exit EndIf ; В массиве $aRecords будут содержаться все строки файла... ; В массив $aLnk читается каждая строчка состоящая из данных ярлыка $aSet = StringSplit($aRecords[1], "|") If $restore_lnk2 = '' Then $restore_lnk2 = $aSet[1] ; если не указан путь, установить путь из бэкапа в первой строке For $i=3 To $aRecords[0] ; решение проблемы пустых строк, пропускать цикл для пустой строки If $aRecords[$i]<>'' Then $aLnk = StringSplit($aRecords[$i], "|") ; проверка, если ярлык содержит "\", то это путь и нужно создать каталог If StringInStr($aLnk[1], '\') > 0 Then $aDirlnk=StringRegExp($aLnk[1], "(^.*)\\(.*)$", 3) If Not FileExists($restore_lnk2&'\'&$aDirlnk[0]) Then DirCreate($restore_lnk2&'\'&$aDirlnk[0]) EndIf ; создание ярлыка FileCreateShortcut($aLnk[2],$restore_lnk2&'\'&$aLnk[1]&'.lnk',$aLnk[3],$aLnk[4],$aLnk[5],$aLnk[6],'',$aLnk[7]) EndIf Next Case $msg = -3 ExitLoop EndSelect WEnd ;====================================================================================================== ; функция поиска всех файлов в каталоге Func FileFindNextFirst($FindCat) $Stack[0] = 1 $Stack1[1] = $FindCat $Stack[$Stack[0]] = FileFindFirstFile($Stack1[$Stack[0]] & "\*.*") Return $Stack[$Stack[0]] EndFunc ;==>FileFindNextFirst Func FileFindNext() While 1 $file = FileFindNextFile($Stack[$Stack[0]]) If @error Then FileClose($Stack[$Stack[0]]) If $Stack[0] = 1 Then Return "" Else $Stack[0] -= 1 ContinueLoop EndIf Else If StringInStr(FileGetAttrib($Stack1[$Stack[0]] & "\" & $file), "D") > 0 Then $Stack[0] += 1 $Stack1[$Stack[0]] = $Stack1[$Stack[0] - 1] & "\" & $file $Stack[$Stack[0]] = FileFindFirstFile($Stack1[$Stack[0]] & "\*.*") ContinueLoop Else Return $Stack1[$Stack[0]] & "\" & $file EndIf EndIf WEnd EndFunc ;==>FileFindNext |