Что нового

Копирование выделенных файлов

vova-n

Новичок
Сообщения
27
Репутация
0
В офисе есть задача раскидывать определённые файлы по определённым папкам на сервере. Хочется в проводнике windows выделить нужные файлы, далее через контекстное меню вызвать скрипт и чтобы он скопировал выбранные файлы в зависимости от их названия в соответствующие папки. ЧАТГПТ не помогает. Загвоздка именно с тем как передать в скрипт имена выделенных файлов. Способ когда я сначала запускаю скрипт, тот вызывает диалоговое окно открытия файлов где я уже выбираю файлы работает. Но приходится тогда лазать по папкам... А папка то рабочая сегодня одна завтра другая и она всегда открыта. Файлы вот под рукой. Выдели да запусти скрипт казалось бы.
Сообщение автоматически объединено:

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

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
Код:
$hGui = GUICreate('WM_DROPFILES', 725, 210, -1, -1, -1, $WS_EX_ACCEPTFILES)
$iEdit = GUICtrlCreateEdit('', 5, 5, 350, 200,'',$WS_EX_TRANSPARENT)
$iEdit2 = GUICtrlCreateEdit('', 370, 5, 350, 200,'',$WS_EX_TRANSPARENT)
GUISetState()
;=====================================================;
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES")
Do
Until GUIGetMsg() = -3
Func WM_DROPFILES($hwnd, $msg, $wParam, $lParam)
$aCursorInfo = GUIGetCursorInfo($hGui)
Local $aRet = DllCall("shell32.dll", "int", "DragQueryFile", "int", $wParam, "int", -1, "ptr", 0, "int", 0)
Local $sDroppedFiles, $i, $tBuffer = DllStructCreate("char[256]")
For $i = 0 To $aRet[0] - 1
DllCall("shell32.dll", "int", "DragQueryFile", "int", $wParam, "int", $i, "ptr", DllStructGetPtr($tBuffer), "int", DllStructGetSize($tBuffer))
$sDroppedFiles &= DllStructGetData($tBuffer, 1) & @CRLF
Next
DllCall("shell32.dll", "none", "DragFinish", "int", $wParam)
$tBuffer = 0
;=====================================================;
if $aCursorInfo[4] = 3 then
GUICtrlSetData($iEdit, StringTrimRight($sDroppedFiles, 2))
else
GUICtrlSetData($iEdit2, StringTrimRight($sDroppedFiles, 2))
endif
EndFunc
В окно кидаешь выделенные файлы, получаешь пути, делаешь что дальше надо.
 
Автор
V

vova-n

Новичок
Сообщения
27
Репутация
0
Спасибо. Похожий вариант у меня есть. Когда например с панели задач сначала запускается скрипт который через диалоговое окно просит выбрать файлы. Выбираешь и они скопированы. Проблема от которой и хочется то уйти - чтобы пользователи не лазали по папкам (ни в проводнике ни в диалоговом окне скрипта). На это тратится куча времени. Сейчас без скрипта как это устроено - пользователь работает в одной папке и ему надо скопировать свою работу (разные файлы PDF, DWG, XLSX) в папки на сервере. И вот он по одному файлу копируeт это по разным папкам. Иногда забывают скопировать какой-то файл. Копирование это пол дела. Далее надо каждый файл на сервере выложить в специальный журнал. Для этого копируем путь каждого файла и вставляем в журнал. А это опять лазать по папкам, только теперь уже на сервере. Иногда можно забыть выложить в журнал какой-то файл... Вот это всё и хочу автоматизировать. Выделил файлы на своём компе > магия autoit > файлы скопировались на сервер и в журнал. Вариант с перетаскиванием в принципе не плох. Даже если вызвалось кучу таких окон, перетащили в одно... далее Enter и пошло копирование. Потом всё закрыть...
Сообщение автоматически объединено:

Вот нашёл на просторах интернета решение своей задачи. Вроде работает.

Код:
; ** Скрипт запрещения двойного запуска приложений**
;~ https://habr.com/ru/articles/212413/

; Функция Singleton создаёт семафор при помощи  WinAPI. Если такой семафор уже создан, то заканчиваем работу
Func Singleton($semaphore)
    Local $ERROR_ALREADY_EXISTS = 183
    DllCall("kernel32.dll", "int", "CreateSemaphore", "int", 0, "long", 1, "long", 1, "str", $semaphore)
    Local $lastError = DllCall("kernel32.dll", "int", "GetLastError")
    If $lastError[0] = $ERROR_ALREADY_EXISTS Then Exit -1
EndFunc

Singleton("Mutex")

; Системная функция ShellExecuteWait запускает приложение и ожидает окончания работы с ним
; Дожидаться завершения программы нужно, чтобы корректно работал Mutex
; $CmdLineRaw - параметр запуска получаемый скриптом
ShellExecuteWait("D:\AutoIt scripts\CopyToFolders\a plus b.exe", $CmdLineRaw, @ScriptDir, "open", @SW_MAXIMIZE)
 
Последнее редактирование:
Верх