AutoIt: 3.2.12.1 - 3.3.4.0
Версия: 0.3
Категория: Автоматизация, Вспомогательные функции
Описание: Панелька управления для дополнительных операций над каталогом/файлом вызываемая из контекстного меню. Скрипт легко можно расширить добавив свои действия. Оболочка делится на два интерфейса, для папок и для всех файлов. Используемую бесплатную утилиту Scanner можно скачать здесь. Скрипт используется без компилирования, при первом старте копируется в системный каталог и прописывается в реестре. Для удаления регистрации скрипта в реестре открываем из контекстного меню любого файла и жмём крестик (на скрине). Из системного каталога удаляем вручную. Имя скрипта contmenu.au3. У каждой кнопки есть всплывающая подсказка. В "шапке" скрипта можно указать свои пути, если они отличаются.
Примечание: Не для группового выделения файлов/папок, так как на каждое откроется отдельный диалог. Тестировал только на WindowsXP.
Код:
Снимок:
История версий: Оптимизирован код удаления, добавлен 7zip.
Автор: AZJIO
Версия: 0.3
Категория: Автоматизация, Вспомогательные функции
Описание: Панелька управления для дополнительных операций над каталогом/файлом вызываемая из контекстного меню. Скрипт легко можно расширить добавив свои действия. Оболочка делится на два интерфейса, для папок и для всех файлов. Используемую бесплатную утилиту Scanner можно скачать здесь. Скрипт используется без компилирования, при первом старте копируется в системный каталог и прописывается в реестре. Для удаления регистрации скрипта в реестре открываем из контекстного меню любого файла и жмём крестик (на скрине). Из системного каталога удаляем вручную. Имя скрипта contmenu.au3. У каждой кнопки есть всплывающая подсказка. В "шапке" скрипта можно указать свои пути, если они отличаются.
Примечание: Не для группового выделения файлов/папок, так как на каждое откроется отдельный диалог. Тестировал только на WindowsXP.
Код:
Код:
$password='ru-board' ; указываем пароль для упаковки архивов
;$AutoIt3Path = @SystemDir & '\AutoIt3.exe''
$AutoIt3Path = @ProgramFilesDir&'\AutoIt3\AutoIt3.exe'
$ScanPath = @ProgramFilesDir&'\Scanner\Scanner.exe'
$WinRARPath = @ProgramFilesDir&'\WinRAR\WinRAR.exe'
$7zipPath = @ProgramFilesDir&'\7-Zip\7z' ; файл 7z.exe специально указан без расширения, не путаться...
#NoTrayIcon ;скрыть в системной панели индикатор AutoIt
Global $Stack[50], $Stack1[50], $aFolder, $aPathexe[1]
$close = RegRead("HKLM\SOFTWARE\script_az\contmenu", "close")
If @error = 1 Then
RegWrite("HKLM\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)
$7zip = GUICtrlCreateButton("7z", 315, 40, 21, 21, 0x0040)
GUICtrlSetTip(-1, "Упаковать с паролем" & @CRLF & "(указать в скрипте)")
GUICtrlSetImage(-1, $7zipPath&'FM.exe', 1, 0)
If FileExists($7zipPath&'.exe') Then GUICtrlSetPos($7zip, 110, 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)
GUICtrlSetTip(-1, "Только для списка файлов")
GUICtrlCreateLabel(" Тип:", 210, 72, 29, 17)
$Typelist = GUICtrlCreateInput ("", 243, 70, 57, 20)
GUICtrlSetTip(-1, "Список только для" & @CRLF & "указанных типов файлов")
$Labelkol = GUICtrlCreateLabel("", 180, 40, 90, 20) ; количество удалённых
GUICtrlSetTip(-1, 'Количество файлов'& @CRLF &'при нажатии "Удалить"')
$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 = $7zip
_7zip()
Case $msg = $winrar
_winrar()
Case $msg = $Virtcd1
Run ( @Comspec&' /C subst y: "'&$sTarget&'"', '', @SW_HIDE )
Sleep(150)
_subst()
_cc()
Case $msg = $Virtcd2
Run ( @Comspec&' /C subst y: /d', '', @SW_HIDE )
Sleep(150)
_subst()
_cc()
Case $msg = $list
$Typelist0=GUICtrlRead($Typelist)
$mode0=''
If $Typelist0<>'' Then $mode0=1
$Text = ""
If GUICtrlRead($subfol) = 1 Then ; поиск в подпапках
FileFindNextFirst($sTarget)
While 1
$tempname = FileFindNext($Typelist0, $mode0)
If $tempname = "" Then ExitLoop
$Text &= $tempname & @CRLF
WEnd
If GUICtrlRead($listfull) = 4 Then $Text = StringRegExpReplace($Text, "(?:.*)\\(.*\r\n)", '\1')
Else
FileFindNextFirst($sTarget) ; поиск папок в корне
While 1
$tempname = FileFindNext('',2,2)
If $tempname = "" Then ExitLoop
If GUICtrlRead($listfull) = 1 Then
$Text &= $tempname & @CRLF
Else
$aPath = StringRegExp($tempname, "(^.*)\\(.*)$", 3)
$Text &= $aPath[1] & @CRLF
EndIf
WEnd
FileFindNextFirst($sTarget)
While 1
$tempname = FileFindNext($Typelist0, $mode0,1) ; поиск файлов в корне
If $tempname = "" Then ExitLoop
If GUICtrlRead($listfull) = 1 Then
$Text &= $tempname & @CRLF
Else
$aPath = StringRegExp($tempname, "(^.*)\\(.*)$", 3)
$Text &= $aPath[1] & @CRLF
EndIf
WEnd
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')
_cc()
Case $msg = $cacls
_cacls()
Case $msg = $Scanner
ShellExecute($ScanPath, '"' & $sTarget & '"', '', '', @SW_HIDE)
_cc()
Case $msg = $comstr
Run(@SystemDir & '\cmd.exe /k cd "' & $sTarget & '"')
_cc()
Case $msg = $dfile
$delcombo0 = GUICtrlRead($delcombo)
$kol = 0
FileFindNextFirst($sTarget)
While 1
$tempname = FileFindNext()
If $tempname = "" Then ExitLoop
If StringInStr(';'&$delcombo0&';', ';'&StringRegExpReplace($tempname, '(?:^.*)\.(.*)$', '\1')&';')>0 Then
If GUICtrlRead($checkAtrb) = 1 Then FileSetAttrib($tempname, "-RASHT")
FileDelete($tempname)
$kol += 1
EndIf
WEnd
GUICtrlSetData($Labelkol, 'удалено ' & $kol)
_cc()
Case $msg = $checkclose
_checkclose()
Case $msg = -3
ExitLoop
EndSelect
WEnd
Else
; здесь для файлов.
; начало создания окна, вкладок, кнопок.
GUICreate($aPath[1], 310, 105) ; размер окна
$tab = GUICtrlCreateTab(0, 0, 310, 105) ; размер вкладки
$checkclose = GUICtrlCreateCheckbox("Закрывать диалог при клике на кнопке", 10, 10, 266, 24)
If $close = '1' Then GuiCtrlSetState(-1, 1)
$uninstall = GUICtrlCreateButton("unl", 280, 10, 21, 21, 0x0040)
GUICtrlSetTip(-1, "Удалить регистрацию панельки в реестре" & @CRLF & "соответственно удаление из контекст. меню")
GUICtrlSetImage(-1, @SystemDir & '\xpsp2res.dll', 1, 0)
$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)
$7zip = GUICtrlCreateButton("7z", 315, 40, 21, 21, 0x0040)
GUICtrlSetTip(-1, "Упаковать с паролем" & @CRLF & "(указать в скрипте)")
GUICtrlSetImage(-1, $7zipPath&'FM.exe', 1, 0)
If FileExists($7zipPath&'.exe') Then GUICtrlSetPos($7zip, 110, 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 = $uninstall
RegDelete("HKCR\*\shell\contmenu")
RegDelete("HKCR\Folder\shell\contmenu")
RegDelete("HKLM\SOFTWARE\script_az\contmenu")
_cc()
Case $msg = $script
ShellExecute(@ScriptFullPath, '', '', "edit")
Case $msg = $7zip
_7zip()
Case $msg = $winrar
_winrar()
Case $msg = $Pathfull
ClipPut($sTarget)
_cc()
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"')
_cc()
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}")
_cc()
Case $msg = $checkclose
_checkclose()
Case $msg = -3
ExitLoop
EndSelect
WEnd
EndIf
;=====================================================
Func FileFindNextFirst($FindCat)
$Stack[0] = 1
$Stack1[1] = $FindCat
$Stack[1] = FileFindFirstFile($FindCat & "\*.*")
Return $Stack[1]
EndFunc ;==>FileFindNextFirst
Func FileFindNext($type = 'log', $mode = 0, $Level=49)
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
If $Stack[0] = $Level Then ContinueLoop
$Stack[0] += 1
$Stack1[$Stack[0]] = $Stack1[$Stack[0] - 1] & "\" & $file
$Stack[$Stack[0]] = FileFindFirstFile($Stack1[$Stack[0]] & "\*.*")
If $mode=2 Then
Return $Stack1[$Stack[0]]
Else
ContinueLoop
EndIf
Else
If $mode=2 Then ContinueLoop
If $mode=1 Then
If StringRight($Stack1[$Stack[0]] & "\" & $file, 4)<>'.'&$type Then
ContinueLoop
Else
Return $Stack1[$Stack[0]] & "\" & $file
EndIf
Else
Return $Stack1[$Stack[0]] & "\" & $file
EndIf
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)
_cc()
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
Func _7zip()
; генерируем имя нового файла с номером копии на случай если файл существует
$i = 1
While FileExists($aPath[0]&'\'&$aPath[1]&$i&'.7z')
$i +=1
WEnd
$filename=$aPath[0]&'\'&$aPath[1]&$i&'.7z'
If not FileExists($aPath[0]&'\'&$aPath[1]&'.7z') Then $filename=$aPath[0]&'\'&$aPath[1]&'.7z'
Run ( $7zipPath&'.exe a "'&$filename&'" -p"'&$password&'" -mhe -mx9 "'&$aPath[1]&'"', '', @SW_HIDE )
EndFunc ;==>_7zip
Func _cc()
If GUICtrlRead($checkclose) = 1 Then Exit
EndFunc ;==>_cc
Func _checkclose()
If GUICtrlRead($checkclose) = 1 Then
RegWrite("HKLM\SOFTWARE\script_az\contmenu", "close", "REG_SZ", "1")
Else
RegWrite("HKLM\SOFTWARE\script_az\contmenu", "close", "REG_SZ", "0")
EndIf
EndFunc ;==>_checkclose
Снимок:
История версий: Оптимизирован код удаления, добавлен 7zip.
Автор: AZJIO