AZJIO
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору В отличии от Fast-Explorer не тормозит открытие меню, но приходится раскрывать диалоговую панель операций. При установленном в сборке AutoIt3 скрипт самоустанавливается, нужно только правильно его назвать - contmenu.au3 Код: $password='ru-board' ; указываем пароль для упаковки архивов $ScanPath = @ProgramFilesDir&'\Scanner\Scanner.exe' ;$ScanPath = 'C:\Program Files\Scanner\Scanner.exe' $WinRARPath = @ProgramFilesDir&'\WinRAR\WinRAR.exe' If @ComputerName='WinPE' Then $AutoIt3Path = @SystemDir & '\AutoIt3.exe' Else $AutoIt3Path = @ProgramFilesDir&'\AutoIt3\AutoIt3.exe' EndIf #NoTrayIcon ;скрыть в системной панели индикатор AutoIt Global $Stack[50], $Stack1[50], $aFolder, $aPathexe[1] $close = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\script_az\contmenu", "close") If @error = 1 Then RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\script_az\contmenu", "close", "REG_SZ", "1") $close = '1' ;регистрация в реестре и копирование в системную папку при первом запуске RegWrite("HKCR\*\shell\contmenu", "", "REG_SZ", 'Управление файлом') RegWrite("HKCR\*\shell\contmenu\command", "", "REG_SZ", @AutoItExe & ' "' & @SystemDir & '\contmenu.au3" "%1"') RegWrite("HKCR\Folder\shell\contmenu", "", "REG_SZ", 'Управление каталогом') RegWrite("HKCR\Folder\shell\contmenu\command", "", "REG_SZ", @AutoItExe & ' "' & @SystemDir & '\contmenu.au3" "%1"') If Not FileExists(@SystemDir & '\contmenu.au3') Then FileCopy(@ScriptDir & '\contmenu.au3', @SystemDir, 1) EndIf If $CmdLine[0]=0 Then Exit $sTarget = $CmdLine[1] $aPath = StringRegExp($sTarget, "(^.*)\\(.*)$", 3) ; если каталог, тогда ... иначе ... If StringInStr(FileGetAttrib($sTarget), 'D') Then ; начало создания окна, вкладок, кнопок. GUICreate($aPath[1], 310, 165) ; размер окна GUICtrlCreateTab(0, 0, 310, 165) ; размер вкладки $checkclose = GUICtrlCreateCheckbox("Закрывать диалог при клике на кнопке", 10, 10, 290, 24) If $close = '1' Then GuiCtrlSetState(-1, 1) $comstr = GUICtrlCreateButton("cmd", 10, 40, 21, 21, 0x0040) GUICtrlSetTip(-1, "Открыть ком-строку отсюда" & @CRLF & "Для выполнения DOS-команд") GUICtrlSetImage(-1, @SystemDir & '\cmd.exe', 1, 0) $Scanner = GUICtrlCreateButton("scn", 315, 40, 21, 21, 0x0040) GUICtrlSetTip(-1, "Открыть в Scanner, для просмотра" & @CRLF & "занимаемого пространтсва на харде") GUICtrlSetImage(-1, $ScanPath, 1, 0) If FileExists($ScanPath) Then GUICtrlSetPos($Scanner, 35, 40) $Virtcd1 = GUICtrlCreateButton("cd+", 315, 40, 21, 21, 0x0040) GUICtrlSetTip(-1, "Создать виртуальный" & @CRLF & "диск Y: из папки") GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 10, 0) $Virtcd2 = GUICtrlCreateButton("cd-", 315, 40, 21, 21, 0x0040) GUICtrlSetTip(-1, "Отключить виртуальный" & @CRLF & "диск Y:") GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 11, 0) _subst() $winrar = GUICtrlCreateButton("rar", 315, 40, 21, 21, 0x0040) GUICtrlSetTip(-1, "Упаковать с паролем" & @CRLF & "(указать в скрипте)") GUICtrlSetImage(-1, $WinRARPath, 1, 0) If FileExists($WinRARPath) Then GUICtrlSetPos($winrar, 85, 40) $list = GUICtrlCreateButton("", 10, 70, 21, 21, 0x0040) GUICtrlSetTip(-1, "Создать список всех файлов и папок," & @CRLF & "только имена, без подкаталогов") GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 2, 0) $listfull = GUICtrlCreateCheckbox("Полный путь", 35, 70, 90, 20) $subfol = GUICtrlCreateCheckbox("подпапки", 130, 70, 70, 20) $Labelkol = GUICtrlCreateLabel("", 210, 70, 90, 20) $cacls = GUICtrlCreateButton("Доступ", 10, 100, 90, 24) GUICtrlSetTip(-1, "Можно дать доступ к папке" & @CRLF & "System Volume Information") $accfncombo = GUICtrlCreateCombo("", 105, 100, 95, 24) GUICtrlSetData(-1, 'Все|Administrator|Admin|Администратор|System|Гость', 'Все') GUICtrlSetTip($accfncombo, "Пользователи и группы") $access = GUICtrlCreateCombo("", 205, 100, 95, 24) GUICtrlSetData(-1, 'запрет|чтение|запись|изменение|полный', 'полный') GUICtrlSetTip(-1, "Тип доступа") $dfile = GUICtrlCreateButton("Удалить", 10, 130, 55, 24) GUICtrlSetTip(-1, "Удалить тип файлов," & @CRLF & "разделяя через ;") $delcombo = GUICtrlCreateCombo("", 70, 130, 130, 24) GUICtrlSetData(-1, 'bak;gid;log;tmp|htm;html;css;js;php|bmp;gif;jpg;jpeg;png;tif;tiff|exe;msi;scr;dll;cpl;ax|com;sys;bat;cmd', 'bak;gid;log;tmp') $checkAtrb = GUICtrlCreateCheckbox("Снять атрибут", 205, 130, 95, 24) GuiCtrlSetState(-1, 1) GUICtrlSetTip($checkAtrb, "Снимать атрибуты файла" & @CRLF & "для возможности его удалить") $script = GUICtrlCreateButton("au3", 279, 40, 21, 21, 0x0040) GUICtrlSetTip(-1, "Редактировать скрипт" & @CRLF & "(пароль, пути)") GUICtrlSetImage(-1, $AutoIt3Path, 1, 0) GUICtrlCreateTabitem("") ; конец вкладок GUISetState() While 1 $msg = GUIGetMsg() Select Case $msg = $script ShellExecute(@ScriptFullPath, '', '', "edit") Case $msg = $winrar _winrar() Case $msg = $Virtcd1 Run ( @Comspec&' /C subst y: "'&$sTarget&'"', '', @SW_HIDE ) Sleep(150) _subst() Case $msg = $Virtcd2 Run ( @Comspec&' /C subst y: /d', '', @SW_HIDE ) Sleep(150) _subst() Case $msg = $list $Text = "" If GUICtrlRead($subfol) = 1 Then ; если подпапки то используем скоростной алгоритм NIKZZZZ FileFindNextFirst($sTarget) While 1 $tempname = FileFindNext() If $tempname = "" Then ExitLoop $Text &= $tempname & @CRLF WEnd If GUICtrlRead($listfull) = 4 Then $Text = StringRegExpReplace($Text, "(?:.*)\\(.*\r\n)", '\1') Else $aFolder = _FileListToArrayEx($sTarget, "", 0, 0) For $i = 2 To $aFolder[0] If GUICtrlRead($listfull) = 1 Then $Text &= $aFolder[$i] & @CRLF Else $aPath = StringRegExp($aFolder[$i], "(^.*)\\(.*)$", 3) $Text &= $aPath[1] & @CRLF EndIf Next EndIf ClipPut($Text) $file = FileOpen(@TempDir & '\file.txt', 2) If $file = -1 Then MsgBox(0, "Ошибка", "Не возможно открыть файл.") Exit EndIf FileWrite($file, $Text) FileClose($file) Run('Notepad.exe ' & @TempDir & '\file.txt') If GUICtrlRead($checkclose) = 1 Then Exit Case $msg = $cacls _cacls() Case $msg = $Scanner ShellExecute($ScanPath, '"' & $sTarget & '"', '', '', @SW_HIDE) If GUICtrlRead($checkclose) = 1 Then Exit Case $msg = $comstr Run(@SystemDir & '\cmd.exe /k cd "' & $sTarget & '"') If GUICtrlRead($checkclose) = 1 Then Exit Case $msg = $dfile $delcombo0 = GUICtrlRead($delcombo) $aDelcombo0 = StringSplit($delcombo0, ";") $kol = 0 For $i = 1 To $aDelcombo0[0] FileFindNextFirst($sTarget) While 1 $tempname = FileFindNext() If $tempname = "" Then ExitLoop If StringRegExpReplace($tempname, '(?:^.*)\.(.*)$', '\1') = $aDelcombo0[$i] Then ;MsgBox(0, "Сообщение", $tempname) If GUICtrlRead($checkAtrb) = 1 Then FileSetAttrib($tempname, "-RASHT") FileDelete($tempname) $kol += 1 EndIf WEnd Next ;MsgBox(0, "Сообщение", $kol) GUICtrlSetData($Labelkol, 'удалено ' & $kol) If GUICtrlRead($checkclose) = 1 Then Exit Case $msg = $checkclose If GUICtrlRead($checkclose) = 1 Then RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\script_az\contmenu", "close", "REG_SZ", "1") Else RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\script_az\contmenu", "close", "REG_SZ", "0") EndIf Case $msg = -3 ExitLoop EndSelect WEnd Else ; здесь для файлов. ; начало создания окна, вкладок, кнопок. GUICreate($aPath[1], 310, 105) ; размер окна $tab = GUICtrlCreateTab(0, 0, 310, 105) ; размер вкладки $checkclose = GUICtrlCreateCheckbox("Закрывать диалог при клике на кнопке", 10, 10, 290, 24) If $close = '1' Then GuiCtrlSetState(-1, 1) $comfile = GUICtrlCreateButton("Открыть ком-строку отсюда", 10, 40, 21, 21, 0x0040) GUICtrlSetTip(-1, "Открыть ком-строку отсюда" & @CRLF & "Для выполнения DOS-команд") GUICtrlSetImage(-1, @SystemDir & '\cmd.exe', 1, 0) $winrar = GUICtrlCreateButton("rar", 315, 40, 21, 21, 0x0040) GUICtrlSetTip(-1, "Упаковать с паролем" & @CRLF & "(указать в скрипте)") GUICtrlSetImage(-1, $WinRARPath, 1, 0) If FileExists($WinRARPath) Then GUICtrlSetPos($winrar, 85, 40) $Pathfull = GUICtrlCreateButton("", 35, 40, 21, 21, 0x0040) GUICtrlSetTip(-1, "Линк файла в буфер," & @CRLF & "полный путь и имя") GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 2, 0) $assot = GUICtrlCreateButton("", 60, 40, 21, 21, 0x0040) GUICtrlSetTip(-1, "Открыть каталог" & @CRLF & "ассоциированной программы") GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 4, 0) $cacls = GUICtrlCreateButton("Доступ", 10, 70, 90, 24) GUICtrlSetTip(-1, "Установить доступ к файлам") $accfncombo = GUICtrlCreateCombo("", 105, 70, 95, 24) GUICtrlSetData(-1, 'Все|Administrator|Admin|Администратор|System|Гость', 'Все') GUICtrlSetTip($accfncombo, "Пользователи и группы") $access = GUICtrlCreateCombo("", 210, 70, 90, 24) GUICtrlSetData(-1, 'запрет|чтение|запись|изменение|полный', 'полный') GUICtrlSetTip($access, "Тип доступа") $script = GUICtrlCreateButton("au3", 279, 40, 21, 21, 0x0040) GUICtrlSetTip(-1, "Редактировать скрипт" & @CRLF & "(пароль, пути)") GUICtrlSetImage(-1, $AutoIt3Path, 1, 0) GUICtrlCreateTabitem("") ; конец вкладок GUISetState() While 1 $msg = GUIGetMsg() Select Case $msg = $script ShellExecute(@ScriptFullPath, '', '', "edit") Case $msg = $winrar _winrar() Case $msg = $Pathfull ClipPut($sTarget) If GUICtrlRead($checkclose) = 1 Then Exit GUICtrlSetTip($Pathfull, "Полный путь и имя" & @CRLF & $sTarget) Case $msg = $cacls _cacls() Case $msg = $assot $type = StringRegExp($sTarget, "(^.*)\.(.*)$", 3) If @error = 1 Then ContinueLoop $astype = RegRead('HKEY_CLASSES_ROOT\.' & $type[1], "") $astype = RegRead('HKEY_CLASSES_ROOT\' & $astype & '\shell\open\command', "") If @error = 1 Then ContinueLoop $aPathexe = StringRegExp($astype, "(^.*)exe(.*)$", 3) If @error = 1 Then ContinueLoop $Pathexe1 = StringReplace($aPathexe[0], '"', '') If FileExists($Pathexe1 & 'exe') Then Run('Explorer.exe /select,"' & $Pathexe1 & 'exe"') If GUICtrlRead($checkclose) = 1 Then Exit Case $msg = $comfile $aPath = StringRegExp($sTarget, "(^.*)\\(.*)$", 3) ClipPut($aPath[1]) Run(@SystemDir & '\cmd.exe /k cd "' & $aPath[0] & '"') WinWait("[CLASS:ConsoleWindowClass]") Send("!{SPACE}") Send("{DOWN 6}") Send("{ENTER}") Send("{DOWN 2}") Send("{ENTER}") If GUICtrlRead($checkclose) = 1 Then Exit Case $msg = $checkclose If GUICtrlRead($checkclose) = 1 Then RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\script_az\contmenu", "close", "REG_SZ", "1") Else RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\script_az\contmenu", "close", "REG_SZ", "0") EndIf Case $msg = -3 ExitLoop EndSelect WEnd EndIf ;$iMode <= 0 -> Folders + files ;$iMode = 1 -> Files only (first element still includes the initial path, wich is the $sPath) ;$iMode = 2 -> Folders only Func _FileListToArrayEx($sPath, $sMask = "*", $iMode = 0, $iLevel = 0) If Not StringInStr(FileGetAttrib($sPath), "D") Then Return SetError(1, 0, 0) $sPath = StringRegExpReplace($sPath, "\\+$", "") $sMask = "(?i)" & StringReplace(StringReplace($sMask, ".", "\."), "*", ".*") StringReplace($sPath, "\", "") Local $iLevel_Slashes = @extended + 1 Local $aPathesArr[2] = [1, $sPath] Local $hSearch, $sFindNext, $i, $iIsDir While $i < $aPathesArr[0] $i += 1 $hSearch = FileFindFirstFile($aPathesArr[$i] & "\*") If $hSearch = -1 Then ContinueLoop While 1 $sFindNext = FileFindNextFile($hSearch) If @error Then ExitLoop $iIsDir = StringInStr(FileGetAttrib($aPathesArr[$i] & "\" & $sFindNext), "D") If $iMode < 2 Or($iMode = 2 And $iIsDir) Then If Not $iIsDir And Not StringRegExp($sFindNext, $sMask) Then ContinueLoop $aPathesArr[0] += 1 ReDim $aPathesArr[$aPathesArr[0] + 1] $aPathesArr[$aPathesArr[0]] = $aPathesArr[$i] & "\" & $sFindNext EndIf WEnd FileClose($hSearch) StringReplace($aPathesArr[$aPathesArr[0]], "\", "") If @extended - $iLevel_Slashes = $iLevel Then ExitLoop Wend If $iMode = 1 Then Local $aTmp_Arr = $aPathesArr Local $iTmp_Count = 1 For $i = 2 To $aPathesArr[0] If StringInStr(FileGetAttrib($aPathesArr[$i]), "D") Then ContinueLoop $iTmp_Count += 1 $aTmp_Arr[$iTmp_Count] = $aPathesArr[$i] Next $aTmp_Arr[0] = $iTmp_Count ReDim $aTmp_Arr[$iTmp_Count + 1] $aPathesArr = $aTmp_Arr EndIf Return $aPathesArr EndFunc ;==>_FileListToArrayEx ;===================================================== 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 Func _cacls() $accfncombo0 = GUICtrlRead($accfncombo) $access00 = GUICtrlRead($access) Switch $access00 Case $access00 = "запрет" $access0 = "N" Case $access00 = "чтение" $access0 = "R" Case $access00 = "запись" $access0 = "W" Case $access00 = "изменение" $access0 = "C" Case $access00 = "полный" $access0 = "F" Case Else $access0 = "F" EndSwitch ShellExecute(@SystemDir & '\cacls.exe', '"' & $sTarget & '" /t /e /p "' & $accfncombo0 & '":' & $access0, '', '', @SW_HIDE) If GUICtrlRead($checkclose) = 1 Then Exit EndFunc ;==>_cacls Func _subst() If FileExists("Y:\") Then GUICtrlSetPos($Virtcd2, 60, 40) GUICtrlSetPos($Virtcd1, 315, 40) Else GUICtrlSetPos($Virtcd1, 60, 40) GUICtrlSetPos($Virtcd2, 315, 40) EndIf EndFunc ;==>_subst Func _winrar() ; генерируем имя нового файла с номером копии на случай если файл существует $i = 1 While FileExists($aPath[0]&'\'&$aPath[1]&$i&'.rar') $i +=1 WEnd $filename=$aPath[0]&'\'&$aPath[1]&$i&'.rar' If not FileExists($aPath[0]&'\'&$aPath[1]&'.rar') Then $filename=$aPath[0]&'\'&$aPath[1]&'.rar' Run ( $WinRARPath&' a -hp"'&$password&'" -m5 "'&$filename&'" "'&$aPath[1]&'"', '', @SW_HIDE ) EndFunc ;==>_winrar |
| Всего записей: 4409 | Зарегистр. 03-05-2006 | Отправлено: 23:48 23-04-2010 | Исправлено: AZJIO, 00:38 24-04-2010 |
|