1

Тема: AHK: Перемещение выделенных файлов в папку

Добрый день,

Посоветуйте пожалуйста какие команды/операторы использовать для следующего скрипта.

Выделяем файлы, зажимаем указанный хоткей, после чего в текущей папке создается папка с названием 001 (если уже есть, то 002 итд) и туда перемещаются выделенные файлы.

Спасибо.

2

Re: AHK: Перемещение выделенных файлов в папку

OFF: Rover, Вы, случайно, Far Manager'ом не пользуетесь?! У меня как раз макрос под это дело есть . Точь-в-точь для описанной задачи.

3

Re: AHK: Перемещение выделенных файлов в папку

alexii, спасибо, к сожалению не пользуюсь, имелся в виду проводник виндоус.

4

Re: AHK: Перемещение выделенных файлов в папку

Мне кажется я нашел что искал,
расширение Files 2 Folder

5

Re: AHK: Перемещение выделенных файлов в папку

Доброго времени суток. Задумка такая, добавить в контекстное меню пунктик, а в нём укажу путь к файлу который нужно запустить(пунктик в меню создать не проблема). Но вот незадача не могу сделать скрипт на перемещение выделенных папок со всеми вложенными в них файлами . Помогите пожалуйста. Так не работает.

1::
FileMoveDir, A_LoopFileFullPath, G:\Down
OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

6

Re: AHK: Перемещение выделенных файлов в папку

Сам я Проводником по понятным причинам не пользуюсь, но выглядит это примерно так:

WinGet, hwnd,, A
ShAp := ComObjCreate("Shell.Application")
Dest := ShAp.NameSpace("G:\Down")

For Window in ShAp.Windows {
   If Window.hwnd = hwnd {
      For Item in Window.Document.SelectedItems
         If Item.IsFolder
            Dest.MoveHere(Item, 14120)
      ExitApp
   }
}

FileMoveDir, % Item.Path, G:\Down тут не отработает.

7

Re: AHK: Перемещение выделенных файлов в папку

Уважаемый Flasher , работает почти везде. Можно ли сделать что бы скрипт работал и на рабочем столе, а то во всех окнах работает а на рабочем столе нет. Ну и если совсем не сложно будет сделать что бы скрипт переносил не только папки со вложениями но и чисто файлы.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

8

Re: AHK: Перемещение выделенных файлов в папку

Ядрён
Ну, были заданы только папки, я условие и добавил. Если нужно всё выделенное, то удаляем строку с If Item.IsFolder.
Насчёт Рабочего стола посмотрю.

9

Re: AHK: Перемещение выделенных файлов в папку

Ядрён, вам же уже отвечали на подобный вопрос:
http://forum.script-coding.com/viewtopic.php?id=9335

10

Re: AHK: Перемещение выделенных файлов в папку

Ядрён
Ну, так что? Не получилось разобраться? Вот c YMP-функцией:

ShAp := ComObjCreate("Shell.Application")
Dest := ShAp.NameSpace("G:\Down")

F6::
WinGetClass, this_class, A
If this_class in WorkerW,Progman
   Dest.MoveHere(DesktopGetSelectedItems(), 13302)
Else {
   WinGet, hwnd,, A
   For Window in ShAp.Windows {
      If Window.hwnd = hwnd {
         For Item in Window.Document.SelectedItems
            Dest.MoveHere(Item, 13302)
         Break
      }
   }
}
Return

DesktopGetSelectedItems()
{   Desktop := ComObjCreate("{9BA05972-F6A8-11CF-A442-00A0C90A8F39}").Item(ComObj(19, 8))
    if ptlb := ComObjQuery(Desktop, "{4C96BE40-915C-11CF-99D3-00AA004AE837}"
                                  , "{000214E2-0000-0000-C000-000000000046}")
    {   if DllCall(NumGet(NumGet(ptlb+0)+15*A_PtrSize), "ptr", ptlb, "ptr*", psv:=0) = 0
        {   VarSetCapacity(IID_IDispatch, 16)
            NumPut(0x46000000000000C0, NumPut(0x20400, IID_IDispatch, "int64"), "int64")
            DllCall(NumGet(NumGet(psv+0)+15*A_PtrSize), "ptr", psv
                , "uint", 0, "ptr", &IID_IDispatch, "ptr*", pdisp:=0)
            Items := ComObjEnwrap(pdisp).SelectedItems()
            ObjRelease(psv)
        }
        ObjRelease(ptlb)
    }
    Return Items
}

11 (изменено: Ядрён, 2017-04-06 04:03:04)

Re: AHK: Перемещение выделенных файлов в папку

Спасибо огромное вам Flasher всё работает.Только один нюанс всё работает только по горячей клавише. Стоит убрать "F6" и всё опять работает везде, только не на рабочем столе. Если запускать через контекстное меню без горячих клавиш то не работает. Как то так.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

12

Re: AHK: Перемещение выделенных файлов в папку

Ядрён
Пож-та. Ясно. Вообще по идее должен и из меню работать, его класс не просматривается.
А не проще для этого подобное использовать (без лишних наворотов)?

13 (изменено: Ядрён, 2017-04-06 11:49:52)

Re: AHK: Перемещение выделенных файлов в папку

Flasher
А подскажите как путь ("G:\Down") прописать в этом "vbs" скрипте.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

14

Re: AHK: Перемещение выделенных файлов в папку

Ядрён
В данном случае можно всё удалить кроме последней строки и вместо Folder вписать этот путь в кавычках.

Точки ставить не забываем.

15

Re: AHK: Перемещение выделенных файлов в папку

Ребят, я, конечно, не против сложных решений, но это делается намного проще:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\CopyTo]
@="{C2FBB630-2971-11d1-A18C-00C04FD75D13}"

[HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\MoveTo]
@="{C2FBB631-2971-11d1-A18C-00C04FD75D13}"

16

Re: AHK: Перемещение выделенных файлов в папку

Ещё у каждого пользователя есть папка SendTo и стандартное меню "Отправить ►". Если туда кинуть ярлык, будет копирование. Если нужно именно перемещение, тогда закинуть в эту папку скрипт.

17

Re: AHK: Перемещение выделенных файлов в папку

mozers
Этот твик помню. У меня он не срабатывает. И сам по себе вариант не годится, иначе бы речь в скрипте шла не про быстрое перемещение в конкретную папку, а про FileSelectFolder.

ypppu
Лишнее движение. Иначе бы тоже предложил.

18

Re: AHK: Перемещение выделенных файлов в папку

Лишнее движение мышкой? Зато не будет лишних пунктиков в контекстном меню.

19

Re: AHK: Перемещение выделенных файлов в папку

Клавиатуру тоже никто не отменял. Как же не будет? SendTo - это тоже контекстное подменю.

20

Re: AHK: Перемещение выделенных файлов в папку

Кому-то удобнеее вложить в SendTo , чем загромождать основное контекстно меню.

В случае выбора пункта контекстного меню клавиатурой движений потребуется не меньше.

21

Re: AHK: Перемещение выделенных файлов в папку

Кому-то удобнее, но так задача не ставилась. Тем более, что в топике по приведённой мной ссылке это уже предлагалось.
В случае использования клавиатуры движений явно меньше с учётом того, что есть выбор по подчёркнутой букве.

22

Re: AHK: Перемещение выделенных файлов в папку

Задача была

Ядрён пишет:

добавить в контекстное меню пунктик

Что мышкой нажать ПКМ, что на клавиатуре AppsKey. Следующим шагом нужно либо мышкой совершить один щелчок, либо на клавиатуре нажать 1 клавишу. Тут клавиатура ни в чём не выигрывает. Зато выделять разрозненные значки удобнее мышкой, а после этого прыгать с мышки на клавиатуру ради подчёркнутой буквы как раз неудобно.

23

Re: AHK: Перемещение выделенных файлов в папку

Меню, а не подменю, в том-то и дело. Мышкой ещё и подвести надо, не промахнувшись. В случае с SendTo вероятность промашки увеличивается втрое. И переходить с мышки на клавиатуру при наличии двух рук не требуется.

24

Re: AHK: Перемещение выделенных файлов в папку

Клавиатурой не всегда можно выделить отдельные значки. Нужная клавиша может оказаться где-то далеко, придётся переводить взгляд на клавиатуру. А если при этом была не та раскладка, придётся ещё и язык переключить.

25

Re: AHK: Перемещение выделенных файлов в папку

Почему не всегда? Держим Ctrl или Shift, выделяем пробелом. Клавишу, в т.ч. не зависящую от раскладки, можно написать любую, которая будет удобна, это не проблема.

26

Re: AHK: Перемещение выделенных файлов в папку

Ядрён, если вы хотите получать имена файлов через контестное меню, которое создадите в реестре, то достаточно вписать в shell реестра комманду, которая будет передаватьать ахк скрипту выделенные файлы.
Типа:

REGEDIT4
[HKEY_CLASSES_ROOT\*\shell\bla-bla-bla]
@="bla-bla-bla"
[HKEY_CLASSES_ROOT\*\shell\bla-bla-bla\Command]
@="\"C:\\Users\\Macev\\Desktop\\test.exe\" \"%1\""

А в файле test.exe написать следующее:

msgbox %1%

27

Re: AHK: Перемещение выделенных файлов в папку

Malcev
Так я выше подобный пример приводил без всякого ahk.

28

Re: AHK: Перемещение выделенных файлов в папку

Зато с VBS.
А тема всё-таки про AHK.
Но и тут и там нужно ещё добавить поддержку папок.

29

Re: AHK: Перемещение выделенных файлов в папку

Если будет штук 100 значков, "путешествовать" по ним с помощью клавиш Ctrl, Shift, Пробел и ← ↑ → ↓ очень долго. Значит понадобится мышь. А если руки трясутся, то можно и по клавиатуре промахнуться, это не аргумент.

30

Re: AHK: Перемещение выделенных файлов в папку

Malcev
Так и замечательно, ничего лишнего кроме системного не понадобится. Насчёт расположения сообщений пока думаю.
Насчёт папок согласен:

[HKEY_CLASSES_ROOT\Directory\shell\MoveTo]
@="Переместить объекты в папку Moved files"

[HKEY_CLASSES_ROOT\Directory\shell\MoveTo\Command]
@="wscript.exe \"С:\\Mover.vbs\" \"%1\""

ypppu
Да мне всё равно. У меня их вообще нет. 100 - это тяжёлый случай. Но тут уже нет смысла развивать демагогию.

31

Re: AHK: Перемещение выделенных файлов в папку

У меня их вообще нет.

Или мы говорим о разном, или мне этого не понять... Недавно было у меня  штук 200 значков на Рабочем столе, прибрался - осталось порядка 50. Очень удобно, всё под рукой. Или взять папку Backup - скидываю туда копии всего, что важно. Там штук 300 значков, и ничего страшного в этом не вижу.

32

Re: AHK: Перемещение выделенных файлов в папку

ypppu
Тогда нам друг друга не понять. Мы из разных параллельных реальностей.

33

Re: AHK: Перемещение выделенных файлов в папку

Flasher пишет:

Так и замечательно, ничего лишнего кроме системного не понадобится

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

34

Re: AHK: Перемещение выделенных файлов в папку

В данном случае одна строка, там править нечего.

35

Re: AHK: Перемещение выделенных файлов в папку

Это сейчас нечего, а вдруг потом понадобится переносить файлы только определенного расширения или даты модификации.

36

Re: AHK: Перемещение выделенных файлов в папку

Зачем выделять файлы, часть из которых не нужны?

37 (изменено: Malcev, 2017-04-06 21:33:00)

Re: AHK: Перемещение выделенных файлов в папку

Например чтобы не мучиться с выделением тех, которые нужны.
А так нажал Ctrl+A и перенес.
Ну или если такое не понадобится, может понадобиться какие-то дальнейшие действия с перенесёнными файлами.

38

Re: AHK: Перемещение выделенных файлов в папку

На всякий спросил. Сам в скриптах для кнопок (к классическому меню очень редко обращаюсь) всегда пишу условия.
Впрочем, это тот же вопрос пары строк. Но тут верно отталкиваться от исходного запроса, не додумывая на пустом месте.

39

Re: AHK: Перемещение выделенных файлов в папку

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

40

Re: AHK: Перемещение выделенных файлов в папку

Malcev пишет:

Варианты топикстартеру предложены

Ядрён - не топикстартер.

41

Re: AHK: Перемещение выделенных файлов в папку

Уважаемый Flasher , огромное спасибо вам . С "vbs" у меня как то не срослось , но всё же я додумал ваш вариант с "AHK". Примитивно конечно , но подходит как раз для контекстного меню.

ShAp := ComObjCreate("Shell.Application")
Dest := ShAp.NameSpace("G:\Down")

WinGetClass, this_class, A
If this_class in WorkerW,Progman
   Dest.MoveHere(DesktopGetSelectedItems(), 13302)
Else {
   WinGet, hwnd,, A
   For Window in ShAp.Windows {
      If Window.hwnd = hwnd {
         For Item in Window.Document.SelectedItems
            Dest.MoveHere(Item, 13302)
         Break
      }
   }
}

WinWaitClose, ahk_class #32768

DesktopGetSelectedItems()
{   Desktop := ComObjCreate("{9BA05972-F6A8-11CF-A442-00A0C90A8F39}").Item(ComObj(19, 8))
    if ptlb := ComObjQuery(Desktop, "{4C96BE40-915C-11CF-99D3-00AA004AE837}"
                                  , "{000214E2-0000-0000-C000-000000000046}")
    {   if DllCall(NumGet(NumGet(ptlb+0)+15*A_PtrSize), "ptr", ptlb, "ptr*", psv:=0) = 0
        {   VarSetCapacity(IID_IDispatch, 16)
            NumPut(0x46000000000000C0, NumPut(0x20400, IID_IDispatch, "int64"), "int64")
            DllCall(NumGet(NumGet(psv+0)+15*A_PtrSize), "ptr", psv
                , "uint", 0, "ptr", &IID_IDispatch, "ptr*", pdisp:=0)
            Items := ComObjEnwrap(pdisp).SelectedItems()
            ObjRelease(psv)
        }
        ObjRelease(ptlb)
    }
    Return Items
}
+ открыть спойлер

Всем кто принимал участие в обсуждении огромное спасибо.

Модератор: мелкие правки в коде взамен перепубликации.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

42

Re: AHK: Перемещение выделенных файлов в папку

Ядрён
Это какая-то бессмыслица. Запись KeyWait, LButton (Хотя лучше даже WinWaitClose, ahk_class #32768) должна быть по логике сверху кода, остальное (*~$LButton::, sleep и ExitApp после выполнения) вообще неясно зачем.
Что там с vbs могло не сложиться для меня тоже большой вопрос.
Хотя понятно, что здешний скрипт (особенно на столе) окажется ощутимо быстрее.

43

Re: AHK: Перемещение выделенных файлов в папку

Спасибо вам Flasher с "WinWaitClose, ahk_class #32768", даже ещё лучше.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

44

Re: AHK: Перемещение выделенных файлов в папку

Ядрён, а каким способом вы добавили контекстное меню?

45

Re: AHK: Перемещение выделенных файлов в папку

Вот простой пример на AutoHotkey. Выделенные объекты перетаскиваем на скомпилированный скрипт. В результате они перемещаются в заданную папку.

Loop, %0%
{
param := %A_Index%
If InStr(FileExist(param), "D")       ;если это папка
	{
	Loop, %param%, 1
	dir_name := A_LoopFileName
	FileMoveDir, %param%, D:\MyFolder\%dir_name%, 2   ;0 - оставить существующие папки; 2 - перезаписывать
	If ErrorLevel
		Er := 1, folder_error .= "`n"param
	}
Else                                  ;иначе это файл
	{
	FileMove, %param%, D:\MyFolder, 1                 ;0 - оставить существующие файлы; 1 - перезаписывать
	If ErrorLevel
		Er := 1, file_error .= "`n"param
	}
GUI, Add, Text, , Следующие объекты не удалось переместить`n`nПапки:%folder_error%`n`nФайлы:%file_error%
}
If Er  ; если возникли проблемы
GUI, Show

46

Re: AHK: Перемещение выделенных файлов в папку

ypppu
Работа с параметрами и неудобное D&D - это про другое. Темка больше для файлменеджеров (тут, кстати, выше FAR называли) и отработки по выбранному откуда угодно (тулбар, хоткеи, комстрока, разные меню).
Кстати, вполне можно обходиться без компиляции.

47

Re: AHK: Перемещение выделенных файлов в папку

Скрипт соответствует названию темы и раздела, а также отвечает на вопрос Ядрён. А что такое D&D - drag and drop? Если да, то это только один из способов. Выше я описывал вариант с пунктом контекстного меню "Отправить в". Можно добавить и свой пункт, но это уже не ко мне.
Нестандартными файлменеджерами не пользуюсь.

48

Re: AHK: Перемещение выделенных файлов в папку

Скрипт соответвует названию, но не запросам. Пусть будет, просто отметил. Про все возможные способы прекрасно знаю. В т.ч. кнопки всяческих тулбаров (как встроенных, так и сторонних). Но компиляция в любом случае - лишняя затея.
Для меня понятие "нестандартный" в отношении файлменеджера кажется надуманным. В то же время называть угрюмый Проводник файлменеджером язык не поворачивается.

49

Re: AHK: Перемещение выделенных файлов в папку

Malcev пишет:

Ядрён, а каким способом вы добавили контекстное меню?

Вот так .

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

50

Re: AHK: Перемещение выделенных файлов в папку

В таком случае странно, что он работает.
Если вы обведете несколько файлов, то каждый из них запустит ваш скрипт.
Вы можете в этом убедиться прописав в скрипте msgbox.

51

Re: AHK: Перемещение выделенных файлов в папку

Malcev , Всё верно этого и добивался.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

52

Re: AHK: Перемещение выделенных файлов в папку

Тогда не понимаю логики.
Получается если у вас 10 выделенных файлов, то запустится 10 скриптов, каждый из которых будет получать эти 10 файлов и переносить их?

53 (изменено: Ядрён, 2017-04-09 04:32:05)

Re: AHK: Перемещение выделенных файлов в папку

Уважаемый Malcev , у меня есть папка куда я кидаю все старые но нужные файлы что то типа архива . Собственно для этого и нужен скрипт с запуском из контекстного меню (что бы не выделять время под уборку пк а в процессе работы кидать файлы в папку архив ). Код здесь.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

54

Re: AHK: Перемещение выделенных файлов в папку

Malcev пишет:

каждый из которых будет получать эти 10 файлов и переносить их?

Как же он их получит в 2-10 попытках?


Ядрён
Почему WinWaitClose, ahk_class #32768 у вас снизу, а не сверху, и зачем там ExitApp?
Не пользуйтесь кросспостингом по сути одного кода. Поправьте в одном месте "пару строк" и при необходимости указывайте ссылку на пост.

55

Re: AHK: Перемещение выделенных файлов в папку

Flasher пишет:

Как же он их получит в 2-10 попытках?

А вы создайте 2 файла гигов по 10 и увидите как.

56 (изменено: Ядрён, 2017-04-09 05:48:26)

Re: AHK: Перемещение выделенных файлов в папку

Уважаемый Flasher , "ExitApp" действительно здесь не нужен , а вот "WinWaitClose, ahk_class #32768" ни на 1 ни на 3 строке не работает.А вот на 16 строке работает как часы.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

57

Re: AHK: Перемещение выделенных файлов в папку

Malcev
У меня те коды не добавляют команду, а вставляют путь из диалога, что не даёт мне возможность быстро протестировать в портабельных условиях, а тратить время на правку сейчас особого желания нет, + есть там другие косячки.

Ядрён
ОК. Посмотрите, что написано зелёным. И поменяйте 14120 (не пойму, откуда у меня такая сумма вылезла) на 13302 в двух местах.

58 (изменено: Ядрён, 2017-04-09 05:47:59)

Re: AHK: Перемещение выделенных файлов в папку

Уважаемый Flasher , с суммой "13302" не работает, а вот по старому с суммой "14120" всё работает как часы.Спасибо огромное вы мне помогли всё работает отлично.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

59

Re: AHK: Перемещение выделенных файлов в папку

Ядрён
Убрал из ваших постов псевдо-дубликаты кода. Отныне правьте код в этом посте, если возникнет необходимость.
Там же и исправил числа, вы спутали 14120 с 32768.