PDA

Показать полную графическую версию : [Архив - Часть 1.2] AutoIt скрипты


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 24 25 26

diPhUZ8R
29-09-2006, 16:08
Подскажите, как с помощью AutoIt, задать конкретному сетевому потключению общий доступ?

Creat0R
29-09-2006, 21:07
По поводу моего предыдущего вопроса - Можно хотябы сделать так, чтобы символы _1 добовлялись вместе с другим расширением, и чтобы если уже есть такие файлы, за место _1 писать _2 и т.д?

Не могу понять почему, но вот этот пример не работает как ожидается (мной):

$Number = 1
;Вписываю все файлы с расширением *.inibak в отдельный временный файл, и ставлю самый новый файл в верх списка
RunWait(@ComSpec & " /c dir /o -d /b /d *.inibak > test.tmp", "", @SW_HIDE)
;Беру число (восьмой символ справа у первой строки) с имени файла (для проверки).
$NumN = StringLeft(StringRight(FileReadLine("test.txt", 1), 8), 1)
FileDelete("test.txt")

;Если в файле test.tmp есть восьмой символ справа у первой строки, то переменной $Num присваевается значение ровняющееся этому символу (числу), плюс 1.
If $NumN <> "" Then $Number = $NumN+1

;Копируются все файлы с расширением *.ini в те же имена, плюс добовляется число, и расширение inibak.
FileCopy("*.ini", "*_" & $Number & ".inibak")

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

-------------

Есть ещё один, более выжный вопрос...

Как можно послать команду в винамп (Winamp), например, на проигрывание файла - не запуск винампа с ком. строкой ровняющейся имени файла, а именно вызов команды в самом винампе?

Как я понимаю, нужно использовать ControlCommand, но как узнать какую команду посылать?
Я пробовал так:

ControlCommand("Player Window", "", "BaseWindow_RootWnd1", 4)

4, это для того, чтобы как-бы вызвать четвёртый пункт в "BaseWindow_RootWnd1" (в Au3Info это то поле, которое видно когда проводишь мышкой по пунктам “Играть”, “Пауза”, “Стоп” и т.д. - В “Восспроизведение”). Но это не срабатывает :( .
Я бы мог конечно просто посылать нажатие клавиш, но мне нужно чтобы это происходило при свёрнутом окне винампа, а для посылки сочетании клавиш, нужно сделать WinActivate, или чтобы окно само было активным.

Sanja Alone
30-09-2006, 04:56
Creat0R
Как можно переименовать все файлы с одним расширением, в те же имена, но до самого расширения добавить символы _1 - а если уже существуют такие имена, то вместо _1 нужно подставить _2 и т.д.Алгоритм такой:

Считываем список файлов по требуемой маске в массив ( $s=_FileListToArray($Dir,"*.dat",1) ). Можешь посмотреть пример реалтизации в моем скрипте (http://sanjaalone.h15.ru/files/reflexivesa.zip) автоустановки/активации игр Reflexive.
Пробегаем по массиву (цикл For), попутно анализируя имена файлов: разделяем по точке на имя ($name) и расширение ($ext). Во вложенном цикле по $i проверяем на существование файлы с окончанием имени "_"&$i в целевом каталоге - FileExists, или среди других эл-тов массива $s - при пом. ф-ции StrInStr (тут как тебе больше нравится; первый вариант для параноиков - а вдруг кто-то во время работы скрипта создаст файл с "хвостом" имени "_"&$i). Затем переименовываем текущий файл aka анализируемый эл-т массива в $name&"_"&$i+1&"."&$ext.
Все.


а для посылки сочетании клавиш, нужно сделать WinActivateТы о Global Hotkeys слышал? Очень удобная штука, особенно когда играешься в какую-нить игру в полноэкранном режиме и нужно уменьшить громкость или перейти к след. трэку в Winamp-е.
Вот тебе код:
;путь к Winamp
$WinampPath=RegRead ( 'HKEY_CURRENT_USER\Software\Winamp', '' )
If $WinampPath="" Then $WinampPath=@ProgramFilesDir & '\Winamp'
;включаем Global Hotkeys
IniWrite ( $WinampPath & '\winamp.ini', 'gen_hotkeys', 'enabled', '1' )
;запускаем Winamp
Run ( $WinampPath & '\Winamp.exe' )
;ждем загрузки процесса Winamp-а в память
ProcessWait ( 'Winamp.exe' )
;посылаем команду "Play"
Send ('^!{INS}')Список хоткеев смотри в настройках Winamp-а (можно и свои сочетания прописать, причем, сразу в секцию [gen_hotkeys] файла winamp.ini).

Creat0R
30-09-2006, 08:38
Sanja Alone
Алгоритм такой:
Приогромнейшее спасибо.
В теории я понимаю как это сделать, но на практике, хоть убейте не получается. Вроде всё просто, уже как говорится, “рецепт написан”, но немогу сложить два плюс два. Если не трудно, покажи плиз как должен выглядеть скрипт, по вызову которого, будет делаться то что я спрашивал:

Как можно переименовать все файлы с одним расширением, в те же имена, но до самого расширения добавить символы _1 - а если уже существуют такие имена, то вместо _1 нужно подставить _2 и т.д.

Вот тебе код:
И на этом спасибо. Если ты не против, можно немного усовершенствовать :) :


$WinampPath=RegRead ( 'HKEY_CURRENT_USER\Software\Winamp', '' )
If $WinampPath="" Then $WinampPath=@ProgramFilesDir & '\Winamp'

;Если Winamp небыл найден, то выводим соответствующее сообщение, и завершаем работу (скрипта)
If Not FileExists($WinampPath) Then
MsgBox(48, "error", "The Winamp ("& $WinampPath &") was not found")
Exit
EndIf

;Если Winamp не запущен, то запустим его
If Not ProcessExists("Winamp.exe") Then
Run($WinampPath & "\winamp.exe")
ProcessWait("Winamp.exe")
EndIf

;Если Global Hotkeys не установлен, то устанавливаем его через винамп
If IniRead($WinampPath, 'gen_hotkeys', 'enabled', '' )=0 Then
AutoItSetOption("WinTitleMatchMode", 4)
WinActivate("classname=BaseWindow_RootWnd", "")
WinWaitActive("classname=BaseWindow_RootWnd", "", 5)
Send("^p")
Send("{pgup}")
Send("{down 6}")
ControlCommand("classname=#32770", "", "Button2", "Check")
Send("{esc}")

Send("!^{INS}")

;Если уже установлен, значит просто посылаем вызов команды проигрывания
Else
Send("!^{INS}")
EndIf


Таким образом, ненужно прописывать в инишке - что позволит установить Global Hotkeys даже если винамп запущен.

garbals
30-09-2006, 13:00
можно с помощью скрипта поменять имя рабочей группы и имя пользователя
мне нужно переделать ipset http://home.electronicinsanity.com/autoit-scripts/ipset.rar
тоесть добавить ввод рабочей группы и имя комтьютера

garbals
30-09-2006, 13:12
и ещё можно ли с помощью AutoIt скрипта настроить VPN соединение

amel27
01-10-2006, 10:48
Creat0R

вариант рабочей функции переименования (без контроля входных параматров!) - номера ранее переименованных файлов не трогаются, новые номера считаются от максимального существующего (поэтому возможны "дыры" в нумерации). По ходу производится приведение всех номеров к единому формату по количеству знаков в номере.
#include <File.au3>
#include <Array.au3>
#Include <String.au3>

_FilesFormatRename ("c:\Test", "_")

Func _FilesFormatRename ($sPath, $delim = "_")
Local $i, $iMaxNum
;Считываем список файлов в массив
Local $FileList = _FileListToArray($sPath, "*", 1)
;Создаем рабочий массив:
Local $WorkList [$FileList[0]+1] [6]
;[][0] - имя файла без расширения
;[][1] - имя файла без расширения и номера
;[][2] - только расширение
;[][3] - старый номер
;[][4] - новый номер
;[][5] - индекс для сортировки
;Заполняем рабочий массив
For $i=1 To $FileList[0]
;выделяем имя, расширение и номер
$WorkList [$i][0] = StringRegExpReplace ($FileList[$i], "\.[^.]*$","")
$WorkList [$i][1] = StringRegExpReplace ($WorkList [$i][0], $delim & '[0-9]*$',"")
$WorkList [$i][2] = StringMid ($FileList[$i], StringLen ($WorkList [$i][0]) +2)
$WorkList [$i][3] = StringMid ($WorkList [$i][0], StringLen ($WorkList [$i][1]) +2) +0
;формируем индекс для сортировки
$WorkList [$i][5] = $WorkList[$i][1] & "." & $WorkList[$i][2] & "." & StringFormat ("%." & StringLen($FileList[0]) & "d", $WorkList[$i][3])
Next
;Сортируем массив по убыванию старого номера
_ArraySort ($WorkList, 1, 1, $FileList[0]+1, 6, 5)

;Основной цикл перенумерации
For $i=1 To $FileList [0]
;проверка на совпадение имени
If $WorkList[$i-1][1] & "." & $WorkList[$i-1][2] = $WorkList[$i][1] & "." & $WorkList[$i][2] Then
;проверка на совпадение номера
If $WorkList [$i][3] = $WorkList [$i-1][3] Then
;если номера совпадают, добавляем в конец списка
$iMaxNum = $iMaxNum +1
$WorkList [$i][4] = $iMaxNum
Else
;если номера отличаются зачем менять?
$WorkList [$i][4] = $WorkList [$i][3]
EndIf
Else
;максимальный номер для нового имени
$iMaxNum=$WorkList [$i][3]
$WorkList [$i][4] = $iMaxNum
EndIf
;формируем индекс для сортировки
$WorkList [$i][5] = $WorkList[$i][1] & "." & $WorkList[$i][2] & "." & StringFormat ("%." & StringLen($FileList[0]) & "d", $WorkList[$i][4])
Next
;Сортируем массив по убыванию нового номера
_ArraySort ($WorkList, 1, 1, $FileList[0]+1, 6, 5)
;Подготовка к переименованию
FileChangeDir ($sPath)
FileSetAttrib("*", "-R")
;Собственно цикл переименования
For $i=1 To $FileList [0]
;проверка на совпадение имени
If ($WorkList[$i-1][1] & "." & $WorkList[$i-1][2]) <> ($WorkList[$i][1] & "." & $WorkList[$i][2]) Then $iMaxNum = $WorkList [$i][4]
FileMove ($WorkList [$i][0] & "." & $WorkList [$i][2], _
$WorkList [$i][1] & $delim & StringFormat ("%." & StringLen ($iMaxNum) & "d", $WorkList [$i][4]) & "." & $WorkList [$i][2])
Next
EndFunc

amel27
01-10-2006, 12:17
garbals
мне нужно переделать ipset
дык там все делается через NETSH, а AutoIT только графическая оболочка... поэтому подбери сначала (в другой ветке форума) требуемую CMD-утилитку, а потом _RunDOS или RunWait. :)

Creat0R
01-10-2006, 13:27
amel27
вариант рабочей функции переименования
Во-первых большое спасибо за проведённое время за написанием этой не мелкой функции. Но дело в том, что это не совсем то :( . Этот пример переименовывает все файлы в указанном каталоге, а мне нужно чтобы переименовывались файлы с определённым расширением (чтобы в использовании функции возможно было указать рпасширение).
Также эта функция переименовывает всего один раз, при повторном запуске, если существуют такие-же файлы, но с последующей цифрой (на одну больше), то эти файлы не переименовываются в существующие, но на одну цифру выше...

Попробую перефразировать задачу:

В папке c:\test, есть 3 файла (кроме прочих) - myfile.dat, hisfile.dat, aourfile.dat - после запуска скрипта, нужно чтобы эти файлы (именно с таким расширением), переименовались в такие имена - myfile_1.dat, hisfile_1.dat, aourfile_1.dat.
Далее, при повторном запуске скрипта, если уже обнаружены такие файлы (myfile_1.dat, hisfile_1.dat, aourfile_1.dat), то именно их трогать ненужно, а нужно все остальные (с таким же расширением, и с таким же началом - до символа _), переименовать в такие файлы - myfile_2.dat, hisfile_2.dat, aourfile_2.dat, а те которые не совпадают в начале имени (до символа _), нужно переименовывать как и в первый раз (добовляя _1).
Точно такой способ, реализован в утилите 7-zip, там при расспаковке файлов (через командную строку), можно указать ключ, который позволит именно этим способом переименовывать существующие файлы.

amel27
01-10-2006, 17:06
Creat0R
дело в том, что это не совсем тоясен пень, я ведь делал для фоток :)
Этот пример переименовывает все файлы в указанном каталоге, а мне нужно чтобы переименовывались файлы с определённым расширением (чтобы в использовании функции возможно было указать рпасширение).ну дык добавь в функцию еще один параметр "маски" и при загрузке в массив используй его вместо "*"
Также эта функция переименовывает всего один раз, при повторном запуске, если существуют такие-же файлы, но с последующей цифрой (на одну больше), то эти файлы не переименовываются в существующие, но на одну цифру выше...звиняюсь, но нифига не понял... у меня переименовываются только те, которые НЕ содержат на конце знак разделителя с номером (aka _X), кстати именно поэтому в названии ф-ции присутствует слово "Format", т.е. происходит преобразование имени к определенному формату. Выравнивание по количеству знаков сделано для правильной сортировки, если не надо - можно убрать.
Точно такой способ, реализован в утилите 7-zipтакой, да не такой - в 7zip файл переименовывается ДО копирования в папку при условии наличия дубликата, т.к. в одной папке не могет быть двух одинаковых файлов, а у тебя все файлы изначально в одной папке и никаких конфликтов по сути нет - одна блаж (шутка). :)

FYI: скрипт подправил, теперь кол-во знаков в номере определяется автоматом

Creat0R
01-10-2006, 21:19
amel27
переименовываются только те, которые НЕ содержат на конце знак разделителя с номером (aka _X)
Вот это-то мне и не нужно :no: . Нужно чтобы было определение на существование файла, и при совпадении, переименование должно происходить также, как это происходит с утилитой 7-zip.

у тебя все файлы изначально в одной папке и никаких конфликтов по сути нет
Вот именно что есть. Ведь я буду скриптом копировать с другого каталога, файлы с тем же расшрением что и в этом каталоге (в котором нужно произвести переименование), поэтому до самого копирования, мне нужно проверить на совпадение имён файлов, и если есть совпадение, то нужно переименовывать файлы как это делает 7-zip. Скорее всего, я не внятно объяснил цель всего этого, а пример с 7-zip привёл лишь для сравнения. В принципе, всё что нужно, так это сделать точно тот-же механизм переименовывания файлов как и у 7-zip.

amel27
02-10-2006, 02:29
Creat0R
Ведь я буду скриптом копировать с другого каталогаЧто и требовалось доказать: "не внятно" не то слово - это уже совсем другая задача:

- у ф-ции будет ДВА рабочих параметра (источник и приемник), а не один;
- сравнивать нужно ПОФАЙЛОВО и расширение тут непричем (конфликтуют ИМЕНА, а не расширения сами по себе)

Допустим, мы хотим проверить существование заданного файла в каталоге и вернуть его новое для этой папки (см. текст ф-ции), алгоритм будет следующий: перед записью в каталог файла (не из этого каталога!) возвращаем через функцию его новое имя и сохраняем уже под этим именем... если что в 7zip именно так.
MsgBox (0,"",_FileNewName ("myfile.dat", "c:\Test"))

Func _FileNewName ($sFile, $dDir, $delim = "_")
$dDir = StringRegExpReplace ($dDir, "\\ *$", "")

Local $sName= StringRegExpReplace ($sFile, "\.[^.]*$", "")
Local $sExtn= StringMid ($sFile, StringLen ($sName) +1)
Local $i=1, $dFile=$sFile
While FileExists ($dDir & "\" & $dFile)
$dFile = $sName & $delim & $i & $sExtn
$i = $i +1
WEnd
Return $dFile
EndFunc

Creat0R
02-10-2006, 18:39
amel27
сравнивать нужно ПОФАЙЛОВО и расширение тут непричем
Ну почему, мне нужно именно группу файлов одного расширения копировать, а проверять пофайлово я немогу, так как заранее не известно какие файлы будут копироваться. Известно лишь то, что в каталоге в который будут копироваться файлы, уже есть такие-же файлы (т.е с тем же расширением), и также 70% верятности того, что в этом каталоге будут совпадать имена файлов с теми что будут туда копироваться.

Функция что ты привёл в пример, отлично справляется с задачей, если бы нужно было переименовывать файлы которые копируются, в таком случае, можно указать и все файлы с определённым расширением. Но мне нужно проверять именно файлы в том каталоге, куда будут копироваться файлы с другого каталога...

Пример:

Имеем два каталога, первый - “c:\test\a” (с которого будут копироваться файлы), второй - “c:\test\b” (в который должный помещаться файлы, и в котором должно проверяться совпадение имён).

В каталоге “b”, перед копированием файлов с каталога “a”, нужно переименовать все файлы с расширением *.dat, но только те которые копируются. Т.е, если допустим, мы копируем два файла - filefirst.dat, filesecond.dat, то для них и нужно проверять совпадение в каталоге “c:\test\b”, если там такие файлы уже есть, то нужно переименовать их в те же имена + _1, но если уже есть и такие имена, то + _2 и т.д...
Чтобы в результате, не было потерь никаких файлов, чтобы те файлы которые копируются с “c:\test\a”, в том же виде поместились в “c:\test\b”, а существующие файлы в “c:\test\b”, чтобы всегда переименовались и сохранялись под разными последовательными именами (с приставкой на конце _1, _2 и т.д).

Balog
03-10-2006, 12:05
Извините, может этот вопрос уже поднимался но поиском ответа не нашел.
Опыта в AutoIt у меня очень мало, и я споткнулся еще на примерах к программе.
У меня русскоязычная винда и хотелось бы писать на русском и английском языках скажем в блокноте и иметь доступ к меню (скажем через ALT).
Проблема в следующем: англоязычные комбинации клавиш не проходят по определению, русскоязычные типа ALT+Ф проходят только если стоит русский язык по умолчанию, но тогда неправильно выводится англоязычный текст. Переключение текущего языка проблемы не решает, а переключения языка по умолчанию я не нашел.
Объясните пожалуйста как решить подобную проблему.

amel27
03-10-2006, 18:07
Creat0Rа проверять пофайлово я немогуинтересно почему?.. та же функция _FileListToArray прекрасно восстановит список файлов по маскечтобы те файлы которые копируются с “c:\test\a”, в том же виде поместились в “c:\test\b”, а существующие файлы в “c:\test\b”, чтобы всегда переименовались и сохранялись под разными последовательными именамисобственно нет никакой разницы чье имя менять - нового файла или существующего, сравни варианты (второй твой):
$sDir = c:\Source\
$dDir = c:\Destin\

$sFiles = _FileListToArray ($sDir, "*.dat")

For $i=1 To $sFiles[0]
$newName = _FileNewName ($sFiles[$i], $dDir)
FileMove ($sDir & $sFiles[$i], $dDir & $newName)
Next$sDir = c:\Source\
$dDir = c:\Destin\

$sFiles = _FileListToArray ($sDir, "*.dat")

For $i=1 To $sFiles[0]
$newName = _FileNewName ($sFiles[$i], $dDir)
If $sFiles[$i] <> $newName Then FileMove ($dDir & $sFiles[$i], $dDir & $newName)
FileMove ($sDir & $sFiles[$i], $dDir & $sFiles[$i])
Next

Sanja Alone
04-10-2006, 03:08
Balog
как решить подобную проблемуСм. FAQ (http://oszone.net/display.php?id=3663) (WinAPI-метод должен помочь).

Creat0R
04-10-2006, 04:51
amel27
Нижний пример почти достигает желаемого результата. Пишу почти, так как есть один нюанс...

При первом запуске скрипта, всё проходит отлично - файлы в папке назначения переименовываются в новые имена (с добавкой _1), а файлы с папки источника, копируются на место тех которые переименовались. Однако, после вторичного запуска скрипта, я ожидал чтобы те файлы (в папке назначения), имена которых совпадают с именами копируемых файлов (с папки источника), переименовались уже не в те же что и в первый раз (с добавкой _1), а в имена с добавкой последующей цифры тем что уже существуют (с добавкой _2 в этом случае). А файлы которые копируются, чтобы стали под их оригинальными именами в папку назначения. Таким образом, всегда будут сохраняться копии всех файлов, из всех попыток копирования файлов - но, рабочие файлы (те которые не должный переименовываться, т.е те которые копируются из папки источника), должный быть всегда под своими оригинальными именами, а те файлы (в папке назначения) которые были под этими же именами, должный всегда быть переименованы с добавкой _1, _2 и т.д, но чтобы были всегда последними в последовательности добавленных к ним цифрам.

Я пытался самостоятельно переделать немного алгоритм, но никак не получается :( - Я понимаю что там требуется внести какое-то мелкое изменение, но оно должно быть правильное, и я пока этого сделать немогу, нехватает опыта что-ли...

Creat0R
04-10-2006, 05:12
amel27
Нижний пример почти достигает желаемого результата
Я сказал почти?! жутко извеняюсь!!! :sorry: - Всё что я описал выше, достигнуто тем примером который ты мне дал!!! СПАСИБО!

Мне всего лишь нужно было заместо перемещения, прописать копирование:

$sDir = "c:\source\"
$dDir = "c:\dest\"

$sFiles = _FileListToArray ($sDir, "*.dat")

For $i=1 To $sFiles[0]
$newName = _FileNewName ($sFiles[$i], $dDir)
If $sFiles[$i] <> $newName Then FileMove ($dDir & $sFiles[$i], $dDir & $newName)
FileCopy ($sDir & $sFiles[$i], $dDir & $sFiles[$i])
Next

Balog
04-10-2006, 09:26
Sanja Alone
WinAPI метод переключает раскладки а не изменяет язык по умолчанию. Переключать язык как я понял сугубо недостаточно. Нужно что бы менялся язык по умолчанию. Если язык по умолчанию русский то команда Send("!Ф") предположим, срабатывает, но тогда неправильно отображается английский текст. Да и надеяться что у пользователя язык по умолчанию будет русский (у меня у самого английский) не приходится.
Так что нужен способ изменения языка по умолчанию. Я понимаю, что для автоматизации инсталляций работа с меню неактуальна, но неужели никто не задавался таким вопросом?

amel27
04-10-2006, 10:25
Creat0R
Мне всего лишь нужно было заместо перемещения, прописать копированиевспомнил, но поздно... хотя самому разобраться пользы больше ;)

FYI: подредактировал ф-цию _FileNewName... старый вариант был короче, но для файлов без расширений всегда возвращал на конце точку - для операций с файлами это не важно, а вот для сравнений не есть гут




© OSzone.net 2001-2012