Что нового

Панелька в контекстном меню файлов и папок

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
AutoIt: 3.2.12.1 - 3.3.4.0
Версия: 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
 

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
Достаточно полезная программка, вот бы ее дополнить одной полезной функцией благо в скрипте все для этого есть , смысл ее регистрация и отмена регистрации dll и ocx файлов от имени пользователя. вопрос к автору возможно ли такое дополнение в вашем скрипте?
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Дополнять можно сколько угодно. Лично у меня регистрация dll вынесена отдельно к этим расширениям, так как не имеет отношения к "просто файлам". Как то так:
Код:
REGEDIT4

# Для регистрации ax и dll
# --------------------------------------------------------------------------------------------

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\axfile\shell\p_regsvr]
@="Зарегистрировать"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\axfile\shell\p_regsvr\command]
@="regsvr32.exe \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\axfile\shell\r_regsvr]
@="Отмена регистрации"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\axfile\shell\r_regsvr\command]
@="regsvr32.exe /u \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\dllfile\shell\p_regsvr]
@="Зарегистрировать"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\dllfile\shell\p_regsvr\command]
@="regsvr32.exe \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\dllfile\shell\r_regsvr]
@="Отмена регистрации"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\dllfile\shell\r_regsvr\command]
@="regsvr32.exe /u \"%1\""

Кстати новая версия здесь

Настройки вынесены в ini
Используется FileOperations.au3 для поиска файлов
При старте предлагает указать пути.
Устанавливается более проще, SFX-архив.
 

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
AZJIO [?]
Кстати новая версия здесь

Спасибо за обновку :beer:
Модераторам надо внести изменения в профиль пользователя , в отображаемые данные пользователя внести доп. инфу тобиш 'личный сайт' и ссылку на него, я то по не внимательности только узнал про ваш сайт а там были полезные вещи ;)
 
Верх