Тема: AHK: Копирование имён файлов папки в блокнот
Подскажите, пожалуйста, команду (или серию команд, параметров, переменных, выражений) для поочерёдного копирования имён файлов определённой папки в текстовой документ.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите, пожалуйста, команду (или серию команд, параметров, переменных, выражений) для поочерёдного копирования имён файлов определённой папки в текстовой документ.
OFF: Если вам нужно добиться данного результат не средствами AHK, а скажем файловым менеджером Total Commander. Выделяем в нем файлы, жмем Вверху "Запуск" - Список только с именами.
Приведу в пример скрипт, которым пользуюсь на работе.
Разбирайтесь.
;~ Создает множество папок в соответствии с кол-вом ворд файлов
;~ и раскидывает по ним исходные файлы (копирует их по папкам)
SetWorkingDir, %A_ScriptDir%
loop, *.doc ; перебирает все вордовские документы в папке
{
name := substr(A_LoopFileName, 1, strlen(A_LoopFileName)-4) ; вытаскивает имя файла
FileCreateDir, %name% ; создает папку с таким именем
FileCopy, %name%.doc , %name%/%name%.doc, 1 ; и копирует исходный файл в эту папку
}
OFF: Если вам нужно добиться данного результат не средствами AHK, а скажем файловым менеджером Total Commander. Выделяем в нем файлы, жмем Вверху "Запуск" - Список только с именами.
Спасибо за подсказку. При случае скачаю этот менеджер и поэкспериментирую. Однако в данный момент хотелось бы поработать именно с AutoHotkey.
Приведу в пример скрипт, которым пользуюсь на работе.
Разбирайтесь.
Благодарю за интересный пример. На основе его создал свой простенький скрипт:
#v::
FileList =
SetWorkingDir, E:\Мастерская\Сайт\39
Loop, *.jpg
{
name := substr(A_LoopFileName, 1, strlen(A_LoopFileName)-4)
FileAppend, %name%, E:\Мастерская\Сайт\39\5.txt
}
Правда, обнаружился один минус: имена файлов записываются в блокнот друг за другом без пробелов. А в идеале хотелось бы, чтобы каждое имя заносилось в отдельную строку (ещё лучше, если через строку). Может, подскажете, что нужно изменить с этом скрипте для осуществление задуманного?
после переменной %name% поставить перенос строки `n (или 2, если надо)
%name%`n`n
после переменной %name% поставить перенос строки `n (или 2, если надо)
Точно! Как же я сам не догадался?!
Итог:
#b::
FileList =
SetWorkingDir, E:\Мастерская\Сайт\40
Loop, *.jpg
{
Size := (A_LoopFileSizeKB)
; Size := substr(A_LoopFileSizeKB, 1, strlen(A_LoopFileSizeKB)-4)
FileAppend, %Size% КБ `n, E:\Мастерская\Сайт\39\5.txt
}
Тогда уж так.
#b::
SetWorkingDir, E:\Мастерская\Сайт\40
Loop, *.jpg
FileAppend, %A_LoopFileSizeKB% КБ`n, E:\Мастерская\Сайт\39\5.txt
return ; в конце хоткея, если он написан на нескольких строках, необходимо ставить эту команду
; в данном случае это не обязательно, но лучше ставить ее всегда
А можно ли модифицировать этот скрипт так, чтобы:
а) брались имена только выделенных файлов;
б) имена файлов копировались в буфер;
в) имена копировались в порядке их выделения (опционально)?
При случае скачаю этот менеджер и поэкспериментирую...
Это операция Total Commander, т.е. построение списков файлов, далеко не единственная, честно говоря, лучше использовать TC, чем AHK, т.е. с построением списка файлов он справится лучше, а тебе не придётся писать скрипт.
Total Commander можно использовать вместо оболочки Explorer, он будет, выполнить все его функции. Я раньше так и делал, правда, в Windows 7 я не пробовал, было лень или просто было не до того.
У всех пользователей, которые используют Windows выходя за пределы Microsoft Office - он установлен, хотя я встречал программистов которые не устанавливали Total Commander, а на вопрос "Почему?", они отвечали "Из принципа, он мне не нравится".
"У всех пользователей", ага
Я один из всех пользователей, но у меня он не стоит.
И первые 4 программиста, которые мне приходят на ум, теперь не могу ТК; двое из них пользуются Фаром, одна не заморачивается и использует проводник и командную строку по необходимости, а четвёртый сидит под Win2K на дефолтных настройках и любит то ли Волков, то ли Нортон.
Однако, я бампнул тему двухлетней давности не для пустого разговора об оболочках и о том, как НЕ пользоваться АХК, а для того чтобы понять, как можно модифицировать скрипт, о котором идёт речь, под мои нужды.
Ну, если уж написал, плюс я жду ответа про ГПСЧ, то отвечу TC, FAR, WC и NC - это одно и тоже. У меня стоит и FAR и ТС, первый для замены ком. строки и по привычке, а второй как замена функционалу Explorer-а, которым я не пользуюсь, т.е. он есть, он есть потому, что есть и не более.
P.S. ГСПЧ - AHK: Опрератор/функция Random - несколько вопросов по использованию.
ТК и Фар весьма отличаются. Вы ещё Directory Opus замешайте в котелок, он же тоже крайне на ТК похож
А по теме точно ничего у вас нету?
А по теме точно ничего у вас нету?
Готового у меня нет, а так надо внимательно прочитать и понять что не получается, я просто наткнулся на фразу про ТС и ответил - сейчас перечитаю тему и отвечу.
Я ещё более полно задачу объясню.
Периодически мне нужно сбрасывать аьской-скайпом списки некоторых файлов и путь к ним.
Скрипт, который превращает локальный путь в сетевой написался проще простого.
А вот как сделать так, чтобы имена скопированных в буфер, например, файлов превращались в текст — мне после возни с DllCall и курением мануала сделать не удалось.
Много знакомых программистов и мало собственных умений
Сейчас пользуюсь плагином ClipboardManager для TrueLaunchBar (на который, кстати, меня ещё один программист подсадил, который любит Фар). Там есть возможность конвертить содержимое буфера в текст, но в данном случае все файлы будут с путями перед именем, да и долго это, много кликов, а у меня руки почти всё время на клавиатуре (потому АХК и люблю).
А можно ли модифицировать этот скрипт так, чтобы:
а) брались имена только выделенных файлов;
б) имена файлов копировались в буфер;
в) имена копировались в порядке их выделения (опционально)?
По теме.
Я не знаю функцию которая определяет/отвечает за выделение файлов
В буфер обмена - это стандартная функция
С порядком выделения, как и с первым, просто разве Explorer выделяет файлы? Я просто не в курсе его файловых операций
А как в Explorer-е выделить файлы? То есть на что надо нажать то?
Моя задумка в том, чтобы что-то сделать с содержимым буфера.
Насколько я понимаю, там после копирования файлов лежит именно путь к ним и есть что-то вроде типа данных, который говорит системе "это файлы, а не текст". Я убеждён в этом на том основании, что мой скрипт автозамены локальных путей на сетевые подменял значения не только в адресе, скопированном из Проводника, но и в пути к скопированному файлу, если там нужное значение попадалось. То есть АХК может видеть путь к скопированному файлу и имя его, соответственно, как текст.
Вот нужный фрагмент кода, о котором я говорю:
OnClipboardChange:
if DllCall("IsClipboardFormatAvailable", "Int", 16) ; CF_LOCALE
{
StringReplace, Clipboard, Clipboard, D:\_works\, \\MACHINE\_works\, All
}
return
Про порядок выделения файлов я замечтался, конечно. Никакого Ins для выделения нету в проводнике, всё либо мышкой с шифтом и контролом, либо с клавиатуры с теми же модификаторами.
Так, я не понял - а что не получается то? Определить выделенные файлы? Или что иное?
Опереации с Clipboard просты в AHK "до безобразия"...
Превратить выделенные и скопированные файлы в список их имён в текстовом виде при нажатии чего-нибудь вроде Ctrl+Alt+C.
Выделите файлы и нажмите F1.
f1::
SendInput,^{vk43}
ClipWait,1
sleep,1000
a:=clipboard
msgbox,%a%
return
Превратить в список имён, а не полных путей к файлу.
Оставить в буфере, а не выплюнуть меседжбоксом.
Используйте "RegExReplace" предварительно отделив строки.
А еще лучше "SplitPath".
Смотрите справку на этот счет.
Запись в буфер:
Clipboard=какой-то текст
Превратить в список имён, а не полных путей к файлу.
Оставить в буфере, а не выплюнуть меседжбоксом.
в русской справке есть пример разбора, правда параметров ком. строки, но принцип тот же - выделение имён.
Справка устарела, а в английской надо посмотреть готовую функцию - могу посмотреть или же сам глянешь?
Я был бы весьма признателен за помощь с этим делом.
Я примерно представляю, как работают регулярные выражения, даже когда-то сайт собирал на SSI и переменных... Но разобрать путь и вырезать из него всё слева до крайнего правого слэша.. при этом переведя всё в текст.. да фиг знает как. Синтаксис АХК прост, но очень расплывчат для меня.
Думаю эта команда подойдёт, если нет, то надо искать по перекрёстным ссылкам в англ. справке.
SplitPath
Разделяет имя файла или URL на составные части: имя, каталог, расширение, диск.
SplitPath, InputVar [, OutFileName, OutDir, OutExtension, OutNameNoExt, OutDrive]
Параметры:
InputVar Имя переменной, которая содержит имя файла для анализа.
OutFileName Имя переменной для сохранения имени файла (без пути к нему). Расширение имени файла включается.
OutDir Имя переменной для сохранения папки файла, включая букву диска или имя сетевого ресурса (если присутствует). Обратная косая черта на конце не ставится, даже если файл находится в корневой папке диска.
OutExtension Имя переменной для сохранения расширения файла (например, TXT, DOC или EXE). Точка не включается.
OutNameNoExt Имя переменной для сохранения имени файла без пути, расширения и точки.
OutDrive Имя переменной для сохранения буквы диска или имени сервера файла. Если файл находится на локальном или подключенном (mapped) сетевом диске, в переменной будет буква диска с двоеточием (без обратной косой черты). Если файл имеет сетевой путь (UNC), переменная будет содержать сетевое имя, например \\Workstation01
Из русской справки, т.е. chm-файла
Прошло достаточно, а тема фактически не закрыта.
Код, выдающий нужный результат, получился вот таким:
#^vk43:: ;c copy file names
Clipboard =
Send, ^{vk43}
ClipWait
Clipboard := RegExReplace(Clipboard, "m`a).*\\(.*)", "$1")
Sort clipboard
return
chegr
Что нужно дописать или изменить, чтобы осталось только имя файла без расширения?
tregalka
Чтоб я знал. Я люблю колдунство, но регулярные выражения — это сильное шаманство.
Надо курить мануалы и примеры, например, начав отсюда:
http://stackoverflow.com/questions/624870/regex-get-filename-without-extension-in-one-shot
Задача-то популярная.
Если срастётся, напишите здесь? Мне сейчас очень неудобно экспериментировать
#^vk43:: ;c copy file names
var := Clipboard := ""
Send, ^{vk43}
ClipWait
Loop, Parse, ClipBoard, `n, `r
{
SplitPath, A_LoopField,,,,fileNameNoEXT
var .= fileNameNoExt "`n"
}
msgbox % var
return
Malcev
От Души!!!
Malcev
Подскажите! А как теперь этот текст (результат) записать в файл.
Пробовал дальше писать:
FileAppend, %var%`n, C:\Users\Y\Desktop\Тест.txt
Ничего не происходит (.
А так?
#^vk43:: ;c copy file names
var := Clipboard := ""
Send, ^{vk43}
ClipWait
Loop, Parse, ClipBoard, `n, `r
{
SplitPath, A_LoopField,,,,fileNameNoEXT
var .= fileNameNoExt "`n"
}
FileAppend, %var%`n, %A_Desktop%\Тест.txt
Malcev
Неа, тишина..
Попробуйте запустить скрипт с правами администратора, либо создать файл в другой дериктории. (Директория уже должна быть создана. FileAppend ее не создает.)
Malcev
И до этого пробовал везде С правами администратора тоже не помогает..
Malcev
Пардон! Работает! Только вместо моего файла, он создал новый с названием Тест и пишет туда Это при обычном запуске, без прав адм.
А как теперь быть с другой директорией?) Так по прежнему не работает..
А скрипт в utf-8 сохранен?
Версия Ahk Unicode?
А как теперь быть с другой директорией?) Так по прежнему не работает..
не понял вопроса.
Malcev
Все разобрался!!! Все работает! БОЛЬШОЕ СПАСИБО!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться