1 (изменено: Dr.Jekyll, 2013-04-21 17:08:20)

Тема: AHK: Контекстное меню безопасного удаления

Здравствуйте, господа! Недавно начал изучение AutoHotkey и натолкнулся на маленькую программу SDelete. Возникла идея сделать контекстное меню безопасного удаления файлов и папок с запросом на удаление этих объектов. Собственно, вот код .reg фала

Windows Registry Editor Version 5.00

#####################
# ContextDeleteMenu #
#####################

[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\ContextDeleteMenu]
"MUIVerb"="Безопасное удаление"
"Icon"="SHELL32.dll,131"

[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\ContextDeleteMenu\command]
@="ContextDeleteMenu.exe"

Это код AHK скрипта "ContextDeleteMenu.ahk"

clipboard =
Send, ^{vk43}
ClipWait, 2
clipboard = %clipboard%

MsgBox, 4, ContextDeleteMenu, Удалить безвозвратно: %clipboard%`n`nПродолжить?
IfMsgBox, No, Exit

    Loop, parse, clipboard, `n, `r
{
    Run, sdelete.exe -s "%A_LoopField%", , hide
    MsgBox, 32, ContextDeleteMenu, Удалено`r`n%A_LoopField%, 1.5
    WinWaitClose, ContextDeleteMenu
}

Все это работает на удаление одиночных файлов и папок, но начинаются глюки при выделении и удалении 2 и более объектов.

Пожалуйста, помогите допилить скрипт для удаления нескольких объектов. Также хотелось бы, чтобы в PopUp запросе на удаление объектов указывалось только имя, а не путь + имя объектов .....

Возможно, этот скрипт пригодится не только мне.

Заранее благодарю за помощь!

Лучше день потерять, потом за пять минут долететь!

2

Re: AHK: Контекстное меню безопасного удаления

Помоему проблема в WinWaitClose, ContextDeleteMenu. Посмотрите так есть проблемы при показе выделенного?:


clipboard := FileList := ""
Send, ^{vk43}
ClipWait, 2
clipboard = %clipboard%

Loop, parse, clipboard, `n, `r
{ 
    SplitPath, A_LoopField, OutFileName
    FileList .= OutFileName "`n"
}
MsgBox, 4, ContextDeleteMenu, Удалить безвозвратно:`n`n%FileList%`n`nПродолжить?
IfMsgBox, No
    Exit 
Loop, parse, clipboard, `n, `r 
    MsgBox, 32, ContextDeleteMenu, Удалено`r`n%A_LoopField%, 1.5  
Return

Чего вы ждёте командой WinWaitClose, ContextDeleteMenu?
Попробуйте просто RunWait, sdelete.exe -s "%A_LoopField%", , hide
И что значит "безопасное удаление файлов"?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3 (изменено: Dr.Jekyll, 2013-04-21 17:53:47)

Re: AHK: Контекстное меню безопасного удаления

serzh82saratov пишет:

И что значит "безопасное удаление файлов"?

Это здесь:

http://technet.microsoft.com/ru-ru/sysi … 97443.aspx


serzh82saratov пишет:

Чего вы ждёте командой WinWaitClose, ContextDeleteMenu?

... я только учусь Не долбите сильно ....

Глюки те-же - все мелькает до бесконечности, пока вручную не выйдешь из работы скрипта.

Лучше день потерять, потом за пять минут долететь!

4 (изменено: serzh82saratov, 2013-04-21 21:42:34)

Re: AHK: Контекстное меню безопасного удаления

Глюки те-же - все мелькает до бесконечности

Что мелькает-то?
У вас задача поставлена так, что не поймёшь в чём она заключается...
И совершенно не ясно при каких делах тут, контекстное меню.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5 (изменено: serzh82saratov, 2013-04-21 21:49:37)

Re: AHK: Контекстное меню безопасного удаления

я только учусь

Вы выбрали отличный способ познать новое, игнорируя вопросы...

Посмотрите так есть проблемы при показе выделенного?:

Чего вы ждёте командой WinWaitClose, ContextDeleteMenu?

Попробуйте просто RunWait, sdelete.exe -s "%A_LoopField%", , hide

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6 (изменено: Dr.Jekyll, 2013-04-21 22:03:44)

Re: AHK: Контекстное меню безопасного удаления

ОК. Добавляю в реестр этот регфайл:

Windows Registry Editor Version 5.00

#####################
# ContextDeleteMenu #
#####################

[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\ContextDeleteMenu]
"MUIVerb"="Безопасное удаление"
"Icon"="SHELL32.dll,131"

[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\ContextDeleteMenu\command]
@="ContextDeleteMenu.exe"

Получаю в контекстном меню проводника пункт ""Безопасное удаление".

Далее в C:\Windows\ или C:\Windows\System32\ (не имеет значения) ложу программу SDelete.exe и рядом скомпилированный в exe скрипт AHK ContextDeleteMenu.exe который будет выдавать запрос на подтверждения удаления объектов и в случае подтверждения, будет передавать команду программе SDelete.exe на их удаление ...

Надеюсь, теперь внятно написал ....

Мигают (открываются и закрываются) поочередно все PopUp окна ... пока не остановишь вручную работу скрипта. Это в случае выделения и удаления двух и более объектов.

Лучше день потерять, потом за пять минут долететь!

7

Re: AHK: Контекстное меню безопасного удаления

А что такое "PopUp окна"?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Контекстное меню безопасного удаления

... ну может не так выразился, извиняюсь. Это MsgBox

Лучше день потерять, потом за пять минут долететь!

9 (изменено: serzh82saratov, 2013-04-21 22:10:52)

Re: AHK: Контекстное меню безопасного удаления

Return

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Контекстное меню безопасного удаления

В принципе, этот скрипт нужен для того, чтобы случайно безвозвратно не удалить нужный файл. Можно непосредственно в реестр добавить вместо ContextDeleteMenu.exe - sdelete.exe. Все работает, но без запроса на удаление объектов ...

Лучше день потерять, потом за пять минут долететь!

11

Re: AHK: Контекстное меню безопасного удаления

serzh82saratov пишет:

Return

- это что означает? Можно разжевать чайнику?

Лучше день потерять, потом за пять минут долететь!

12 (изменено: serzh82saratov, 2013-04-21 22:18:35)

Re: AHK: Контекстное меню безопасного удаления

- это что означает?

Вам были заданы вопросы в 5 посте, из ответов на которые можно было бы сделать выводы....

Остальные ваши "текста", увы не возвращают мне сути по сабжу.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Контекстное меню безопасного удаления

Я понял, .... что ничего не понял. Извините. Благодарю за помощь!

Лучше день потерять, потом за пять минут долететь!

14 (изменено: creature.ws, 2013-04-22 01:19:45)

Re: AHK: Контекстное меню безопасного удаления

#NoEnv
#NoTrayIcon
#SingleInstance Ignore
SetBatchLines -1

if !fileList := GetFileList()
    ExitApp

loop Parse, fileList, `n
{
    Splitpath, A_LoopField, fileName
    fileNameList .= fileName . "`n"
}

MsgBox, 4, ContextDeleteMenu, Удалить безвозвратно:`n`n%fileNameList%`n`nПродолжить?
IfMsgBox, No, ExitApp

loop Parse, fileList, `n
    FileWipe(A_LoopField)

FileWipe(ByRef filePath) {
    RunWait sdelete.exe -s "%filePath%",, hide UseErrorLevel
    if !ErrorLevel
        MsgBox, 32, ContextDeleteMenu, Удалено`r`n%filePath%, 1.5
}

GetFileList() {
    clipboard := ""
    Send, ^{vk43}
    ClipWait, 2
    return Clipboard
}

Список файлов из проводника можно получать с помощью COM, механизм «безопасного удаления» sdelete — реализовать на autohotkey. FileWipe и GetFileList используют способ предложенный в первом сообщении.

«Глюки», вероятно, возникали при множественном запуске скрипта и sdelete.

15

Re: AHK: Контекстное меню безопасного удаления

Off:

creature.ws пишет:

Список файлов из проводника можно получать с помощью COM


Кстати, что-то компактнее этого появилось?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16 (изменено: Dr.Jekyll, 2013-04-22 11:27:14)

Re: AHK: Контекстное меню безопасного удаления

Большое спасибо, creature.ws! Теперь все заработало, как хотелось, но при множественном выделении почему-то удаляется только по одному файлу, хотя MsgBox сообщает, что файлы xxxxx.xxx удалены.

creature.ws пишет:

Список файлов из проводника можно получать с помощью COM, механизм «безопасного удаления» sdelete — реализовать на autohotkey. FileWipe и GetFileList используют способ предложенный в первом сообщении.

«Глюки», вероятно, возникали при множественном запуске скрипта и sdelete.

А как это все реализовать и какой вариант лучше? ... Я пока еще не "догоняю". Если Вам не сложно, пожалуйста! Мне легче понять это из кода скрипта, чем искать в справке ....

Лучше день потерять, потом за пять минут долететь!

17 (изменено: creature.ws, 2013-04-22 19:01:43)

Re: AHK: Контекстное меню безопасного удаления

MsgBox сообщает, что файлы xxxxx.xxx удалены.

В коде сообщения #14 нет Msgbox с таким сообщением.

и какой вариант лучше?

Тот, который работает. В данный момент у вас есть один вариант.

18 (изменено: creature.ws, 2013-04-25 12:28:32)

Re: AHK: Контекстное меню безопасного удаления

Кстати, что-то компактнее этого появилось?

Для окон проводника:

ExplorerGetSelection(hwnd := "") {
; всего лишь пример. 
    (hwnd) || hwnd := WinExist("A")
    WinGetClass winClass, ahk_id %hwnd%

    if (winClass != "CabinetWClass" && winClass != "ExploreWClass")
        return

    for explorerWindow in ComObjCreate("Shell.Application").Windows {
        if (explorerWindow.hwnd != hwnd)
            continue

        for selectedItem in explorerWindow.Document.SelectedItems
            itemList .= selectedItem.path . "`n"
    }
    explorerWindow := selectedItem := ""
    return Rtrim(itemList) ; возвращается строка включающая пути выделенных файлов. разделитель `n
}

Как получить список выделенных файлов на рабочем столе  — по ссылке.

19 (изменено: Dr.Jekyll, 2013-04-26 13:07:36)

Re: AHK: Контекстное меню безопасного удаления

Пока не было времени заниматься этим, но думаю, проблема заключается в неверной передаче SDelete.exe команды на удаление сразу несколько объектов "RunWait, sdelete.exe -s "%A_LoopField%", , hide".

SDelete.exe упорно не хочет удалять через скрипт несколько объектов. Не могу понять причину.
Пробовал передать в командной строке команду:
sdelete.exe -s "D:\xxx\111.xxx" && sdelete.exe -s "D:\xxx\222.xxx" && sdelete.exe -s "D:\xxx\333.xxx" - это все работает.

Кажется я понял. RunWait передает команду на ожидание завершения работы SDelete.exe, но не на ожидание завершения удаления каждого из нескольких файлов? Надо реализовать последовательное удаление нескольких объектов после удаления предыдущего, как в команде, обозначенной выше?

Скорее всего, надо копать в этом направлении ....

Лучше день потерять, потом за пять минут долететь!