Что нового

Как по хоткею переместить файл по сценарию - по относительному пути ?

Сообщения
67
Репутация
-1
Добрый день.
Помогите решить вопрос.

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

Чтобы попасть в эту относительную папку - нужно подняться на уровень назад (БэкСпейс), потом зайти в папку "стереть" (Энтер), потом зайти в папку "на отправку" (Энтер) и там вставить Ctrl+V из буфера обмена.
Копирование осуществляется в программе ТоталКоммандер (то есть это не ПроводникВиндоус).
(Я предполагаю, нужно чтобы этот хоткей сперва копировал файл, и при этом запоминал его абсолютный путь - а уже затем определял путь для его копирования.)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
имеет не абсолютный путь, а относительный
Относительно чего? Относительно самого копируемого файла? Относительно файла скрипта? Относительно указанного пути?

Это относительно копируемого файла.
Код:
$FullPath = "D:\dir1\dir2\file.txt"
$DirsPath = StringRegExp($FullPath, ".+\\", 1)[0]
$CopyPath = $DirsPath & "..\стереть\на отправку\"
FileCopy($FullPath, $CopyPath)
 
Автор
D
Сообщения
67
Репутация
-1
Но тут, в коде - адрес файла полностью указан.
Он будет неизвестен вначале - его нужно сперва определить.
То есть по хоткею нужно в том числе - сначала определить адрес выбранного файла.
Сообщение автоматически объединено:

И здесь в коде - не указан хоткей
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
сначала определить адрес выбранного файла
Файла, выделенного в Total Commander?
Код:
WinActivate("Total Commander")
Send("^{ins}")
Sleep(333)
$FullPath = ClipGet()
MsgBox(0, "", $FullPath)


здесь в коде - не указан хоткей
Здесь всё-таки не стол заказов. Самостоятельно сложно по справке?
Код:
HotKeySet()
 
Автор
D
Сообщения
67
Репутация
-1
Файла, выделенного в Total Commander?
Самостоятельно сложно по справке?
Да, в ТоталКоммандер.

Пока не работает.
Вот так установил хоткей:
Код:
HotKeySet("^{SPACE}", "SendHK")

While 1
    Sleep(100)
WEnd

Func SendHK()
WinActivate("Total Commander")
;Send("^{SPACE}")
Sleep(333)
$FullPath = ClipGet()
MsgBox(0, "", $FullPath)

$DirsPath = StringRegExp($FullPath, ".+\\", 1)[0]
$CopyPath = $DirsPath & "..\стереть\на отправку\"
FileCopy($FullPath, $CopyPath)
EndFunc


Скрипт выдает ошибку при нажатии на хоткей.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Скрипт выдает ошибку
Я должен сам догадаться, какую ошибку у вас скрипт выдаёт?

В вашем скрипте отсутствует эта строка
Код:
Send("^{ins}")

Это копирование выделенного файла в буфер обмена. Затем из буфера получаем полный путь к файлу. Вероятно, у вас ошибка по причине отсутствия этой строки.
 
Автор
D
Сообщения
67
Репутация
-1
Добавил в код выделение.
Но скрипт теперь при копировании в одном ТоталКомандере - переключается на другой ТоталКоммандер.
Соответственно в другом окне тоталкомандера - файлы другие и копирования не происходит.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
при копировании в одном ТоталКомандере - переключается на другой ТоталКоммандер
И об этом я тоже должен был догадаться? Вы реально меня за ясновидящего считаете?

Просто удалите или закомментируйте строку активации окна.
Код:
; WinActivate("Total Commander")

Но теперь вам нужно самостоятельно следить за активностью нужного окна Командира.
 
Автор
D
Сообщения
67
Репутация
-1

[B]InnI[/B], Спасибо, вроде работает теперь.​

Только почему-то иногда залипает клавиша "Ctrl"
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
перед отправкой Send проверяет что клавиши отжаты, предотвращая нежелательные.
Код:
Func _SendEx($sSend_Data)
    Local $hUser32DllOpen = DllOpen("User32.dll")
    While _IsPressed("10", $hUser32DllOpen) Or _IsPressed("11", $hUser32DllOpen) Or _IsPressed("12", $hUser32DllOpen)
        Sleep(30)
    WEnd
    Send($sSend_Data)
    DllClose($hUser32DllOpen)
EndFunc   ;==>_SendEx
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
перед отправкой Send проверяет что клавиши отжаты
Если клавиша залипла - скрипт "встанет" в ожидании. Как пользователь догадается вручную отжать клавишу?

Прям не тема, а кастинг на шоу экстрасенсов :biggrin:
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Если клавиша залипла - скрипт "встанет" в ожидании. Как пользователь догадается вручную отжать клавишу?
Желательно, чтобы скрипт в конце выдал сообщение об успешной операции, и если его нет, то автор будет пытаться нажать хоткей повторно думая, что неправильно нажал/недожал и тогда отлипнет и пройдёт комбинация. Если же залипание останется, то к примеру с Ctrl может нажаться ещё один модификатор и хоткей выполнит совсем другое. Где-то у меня был код, который не ожидает, а посылает команду отжатия клавиш, типа Send("{CTRLUP}"), но не могу его найти. Все три клавиши надо посылать или делать раздельные условия. Но во всех моих программах используется просто Sleep(30), так что я оставил как есть, кстати проблем не было.

Используй WinWait(), чтобы получить дескриптор и ControlSend(), чтобы высылать дескриптору, даже если окно свёрнуто. Хотя отработает всё равно мгновенно, даже свернуть не успеешь.

Используй FileExists(), для проверки успешности операции. Или можно при неудаче выдать сообщение что ожидаемый файл не существует.

Можешь посмотреть пример автоматизации окна, например если окно не существует, то надо красиво сообщить об этом, а не получить падение скрипта.
 
Последнее редактирование:

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Зачем такие извращения, файловые менеджеры обычно имеют параметры командной строки...
В Total Commander их полно
Передавайте в скрипт и с помощью $CmdLine получайте то что нужно, формируйте путь и копируйте
А игра с нажатиями может выйти боком...
 

lettterssino

Знающий
Сообщения
109
Репутация
10
Зачем такие извращения, файловые менеджеры обычно имеют параметры командной строки...
В Total Commander их полно
Передавайте в скрипт и с помощью $CmdLine получайте то что нужно, формируйте путь и копируйте
А игра с нажатиями может выйти боком...
Тоже не понял зачем такие махинации сложные, ну в край использовать горячие клавиши их там тоже море.
 
Верх