Что нового

перемещение строк в блокноте

Alexey

Новичок
Сообщения
171
Репутация
0
Версия AutoIt: 3.3.0.0

Описание:
1) в активном окне программы notepad2 (версия - 5.0.26, в процессах - notepad.exe) выделены, к примеру, 10 строк (одна строка содержит название одной песни)

2) выше этих 10 строк в разных местах имеются другие 10 строк с одинаковым содержимым (12 символов, которые начинаются с 4 пробелов):
Код:
    TITLE ""
3) из выделенных 10 строк скрипт должен первую строку переместить в первую из 10 одинаковых строк (между двух кавычек), вторую строку - во вторую из 10 одинаковых строк (тоже между двух кавычек) и так далее по 10 строку включительно

Примечания:
1) нужно для того чтобы радикально упростить самую рутинную, долгую и каждый раз слегка портящую настроение часть процесса преобразования потрэковых музыкальных альбомов (когда много flac-файлов) в образные (1 flac-файл + 1 cue-файл)

2) открытых notepad2-окон может быть много, но изменения должны происходить только в активном
то есть, не должно получиться как в этом случае, когда я спустя несколько лет обнаружил, что скриптом пользоваться нельзя, поскольку перемещаться могут не те выделенные каталоги/файлы (в случае, если запущено больше одного окна проводника, и в каждом выделен хотя бы 1 объект - тогда перемещение происходит в первом окне, даже если оно свёрнуто или вообще не является полноценным проводником, а лишь его вариацией без дерева папок)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Alexey [?]
в активном окне программы notepad2 (версия - 5.0.26, в процессах - notepad.exe) выделены, к примеру, 10 строк (одна строка содержит название одной песни)
Было бы неплохо добавить txt файл (для примера).
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
txt-файл (для примера):
http://autoit-script.ru/index.php?action=downloads;sa=view;down=526

в этом файле (при выделенных строках 33-42) должны быть перемещены:

15 символов строки 33 - в строку 3 (на позицию 12 из 13)
15 символов строки 34 - в строку 6 (на позицию 12 из 13)
15 символов строки 35 - в строку 9 (на позицию 12 из 13)
15 символов строки 36 - в строку 12 (на позицию 12 из 13)
15 символов строки 37 - в строку 15 (на позицию 12 из 13)
15 символов строки 38 - в строку 18 (на позицию 12 из 13)
15 символов строки 39 - в строку 21 (на позицию 12 из 13)
15 символов строки 40 - в строку 24 (на позицию 12 из 13)
15 символов строки 41 - в строку 27 (на позицию 12 из 13)
16 символов строки 42 - в строку 30 (на позицию 12 из 13)
 
A

Alofa

Гость
Не совсем понял из описания когда должен срабатывать скрипт, а точнее какое действие должно послужить толчком к команде на выполнение? Поэтому сделал так:
Код:
#include <Array.au3>

Global $hWnd, $sEdit, $TitleText, $sTextBack, $Index = 0

HotKeySet('{F1}', '_MyFunction') ; Запуск
HotKeySet('{ESC}', '_Escape') ; Отмена изменений

While 1
	Sleep(200)
	If $Index = 1 And Not WinActive($hWnd) Then; Если окно теряет фокус, то "Escape" для данного окна перестает работать 
		WinSetTitle($hWnd, '', $TitleText) 
		$sTextBack = ''
		$Index = 0
	EndIf
WEnd

Func _MyFunction()
	If $Index = 0 Then
		Local $sText, $TSong, $Size
		If Not ProcessExists('notepad.exe') Then
			MsgBox(64, 'Внимание', '"notepad.exe" не запущен!') ; Тут сами придумаете, что писать и что делать дальше
			Return
		EndIf

		$hWnd = WinActivate(WinGetHandle('[CLASS:Notepad]')) ; После того как получен "$hWnd" можете хоть свернуть или скрыть окно - результат редактирования будет однозначно возвращен в данное окно
		If Not $hWnd Then MsgBox(64, 'Внимание', 'Нет активного окна Блокнота!')

		$TitleText = WinGetTitle($hWnd)
		WinSetTitle($hWnd, '', '<<<<< ОКНО ЗАХВАЧЕНО >>>>>')
		
		If MsgBox(36, 'Ваше решение:', 'Проверьте правильность захвата окна' & @CRLF & @CRLF & 'Приступить к обработке?') = 7 Then Return

		$sEdit = ControlGetHandle($hWnd, '', '[CLASS:Edit; INSTANCE:1]')
		$sTextBack = ControlGetText($hWnd, '', $sEdit)
		$sText = $sTextBack
		If $sText Then
			$Pos = StringInStr($sText, 'INDEX', 2, -1)
			$TSong = StringRegExp($sText, '.+[^\v]', 3, $Pos)
			$Size = UBound($TSong)
			If $Size > 1 And Not @error Then
				For $i = 1 To $Size - 1
					$sText = StringRegExpReplace($sText, '(TITLE\h*?")(")', '\1' & $TSong[$i] & '\2', 1)
				Next
				ControlSetText($hWnd, '', $sEdit, $sText)
				ControlSend($hWnd, '', $sEdit, "{SPACE}{BS}") ; Это для того чтобы Notepad среагировал на изменения, чтобы при закрытии выдал запрос сохранения.
			Else
				MsgBox(16, 'Внимание', 'Названия песен в файле отсутствуют!')
			EndIf
		EndIf
		$Index = 1
	EndIf
EndFunc   ;==>_MyFunction

Func _Escape()
	If $Index = 1 Then
		WinActivate($hWnd)
		ControlSetText($hWnd, '', $sEdit, $sTextBack)
		$Index = 0
	EndIf
EndFunc   ;==>_Escape

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

ИМХО лучше работать на уровне файлов. Можно при желании и пакетную обработку организовать.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
когда должен срабатывать скрипт
как и всегда - после вызова скрипта, сконвертированного в ехе-файл
(я лет 6-7 вызываю с помощью изумительной программы keyman 4.28, создавая в ней правило по типу "при нажатии на такую-то клавишу/комбинацию клавиш запускается такой-то файл")
В скрипте не проверяется соответствие количества треков к количеству их названиий
это не имеет значения, так как упомянутую схему "преобразования потрэковых альбомов в образные" я долгое время продумывал и совершенствовал сам, и в ней по определению количество названий всегда будет совпадать с количеством строк, содержащих символы: TITLE ""


Между блоком треков и блоком названий не должно быть никаких знаков, кроме пробелов, табов и знаков переноса строки
там всегда только одна пустая строка (для визуального удобства). собственно, в выложенном txt-файле это хорошо видно
Строка TITLE "" должна иметь именно такой вид (межды кавычками не должно быть ничего)
она всегда имеет только такой вид, поскольку это стандартный шаблон, наполняемый информацией в процессе подготовки cue-файла

пока что этот вариант скрипта не работает - просто появляется значок в области уведомлений (в текстовом файле ничего не происходит)
(я использовал версию 3.3.14.2)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
Alexey
Всё это нужно писать в самом начале!!!
Как говорилось в рекламе - "сколько вешать в граммах"
 
A

Alofa

Гость
Alexey сказал(а):
... пока что этот вариант скрипта не работает ...
Делал для штатного Notepad.
Для Notepad2 - попозже. Праздники же ...



Всех С Новым Годом ! :beer:
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
в скрипте в строке 26 я попробовал изменить на
Код:
$hWnd = WinActivate(WinGetHandle('[CLASS:Notepad2]'))

но задачу это не решило
(хоть я и делал экспериментальным и неудобным мне способом - с использованием F1, прописанной в начале скрипта, а также с ручным запуском ехе-файла)
правда, с данного момента скрипт стал находить окно блокнота и извещать о том, что оно захвачено

к слову, вот это
Код:
WinSetTitle($hWnd, '', '<<<<< ОКНО ЗАХВАЧЕНО >>>>>')

совсем для меня неприемлемо (как и любые скриптовые сообщения/вопросы в мелких окошках)
 
A

Alofa

Гость
Alexey сказал(а):
в скрипте в строке 26 я попробовал изменить ...
Ээ нет, с Notepad2 такое не пройдет. Тут не так все просто.

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

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Alexey
А если всё это дело читать из файла, конвертировать и записать в новый или в тот же файл?
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Alofa, Garrett
я бы мог очень детально и подробно объяснить, почему задача мной поставлена именно таким образом, расписать все многочисленные этапы своей схемы (преобразования отдельных трэков в образ+cue), конкретизировать, что и как продумано и осуществлено, но практика показывает, что в подобных случаях это никому не нужно, не интересно и в итоге ни к какому улучшению для меня не приводит - только моё время теряется и надежда на решение проблемы некоторое время теплится напрасно

я давно существенно разочаровался в этом форуме (уж простите за искренность), поскольку за единичным исключением по-настоящему серьёзных/масштабных задач (да и многих не особо сложных) при помощи "auto it" решить не получается
примеры: 1й (важнейшая для меня проблема),

3й пример - моя идея о безумно удобном массовом переименовании выделенных файлов/каталогов при помощи текстового редактора, используемого в системе по умолчанию, в который передаются по очереди и построчно все выделенные названия для их ручного редактирования богатыми средствами текстового редактора. это всё я даже в свою новую тему оформлять не стал, так как понимаю, что бесполезно будет

4й пример - вместо этой темы создание другой, в которой бы в условиях упоминался скрипт, сразу всё сам делающий:
- и конвертирующий нужные уже выделенные flac-файлы;
- и cue-файл создающий;
- и сам в него всё правильно с точностью до последнего символа прописывающий;
- и чтобы ни милисекунды, ни даже микроскопического звукового сэмпла не терялось в итоге в полученном большом flac-файле;
- и чтобы как-то "версию" flac-файла можно было бы всегда получать актуальную (например, на сегодня - 1.3.1), изредка подсовывая скрипту обновлённый разработчиками flac.exe;
- и чтобы бесполезные тэги уничтожались в процессе;
- и чтобы выполнялись действительно многие другие важнейшие для меня нюансы, не упомянутые выше

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

а на штатном блокноте ничего пробовать не буду по двум причинам - у меня его вообще нет уже несколько лет; к тому же просто не вижу в этом смысла - пользоваться я ведь всё равно буду программой notepad2 (она не шикарна, но мне уже долгое время вполне подходит)
 
A

Alofa

Гость
OffTopic:
Alexey сказал(а):
... так тут тоже создавать подобную просьбу, по сути, нет смысла ...
Смотрю у вас так много задач (и думаю это далеко не все из них) и вам немногие спешат помогать.
Так может есть смысл самому заняться изучением Autoit и задавать вопросы уже в самой посещаемой ветке форума?
С момента создания вами вот Этой темы сколько воды утекло? Согласитесь, за это время можно было бы уже серьезно поднатореть в программировании и самому помогать другим людям. Было бы желание.


Alexey сказал(а):
... ведь даже данная (вроде бы легчайшая) тема почему-то стала ощутимо сложной ...

Ну от чего же.
Код:
#include <Array.au3>
#include <WinAPISys.au3>

Global $hWnd, $sData, $Window = '[REGEXPCLASS:(?i).*?Pad.*?]'

$hWnd = WinGetHandle($Window)
If $hWnd Then
	If BitAND(WinGetState($hWnd), 16) Then Exit ; Если все окна скрыты - то Выход.
	WinActivate($hWnd)
Else
	Exit ; Если окно не существует - то Выход.
EndIf

_FixAccelHotKeyLayout() ; Инфо по функции: http://autoit-script.ru/index.php?topic=5745.15

$sData = ClipGet()
_Send('c')

Local $TSong, $Size, $sTextMod, $sText = ClipGet()
If $sText Then
    $Pos = StringInStr($sText, 'INDEX', 2, -1)
    $TSong = StringRegExp($sText, '\h*(.*[^\v|\h])', 3, $Pos)
    $Size = UBound($TSong)
    Select
		Case $Size > 1 And Not @error
;~ 			$sTextMod = StringRegExp($sText, '((.*\R\h+?)+' &$TSong[0]&')', 1)
;~ 			If IsArray($sTextMod) Then $sText = $sTextMod[0]
            For $i = 1 To $Size - 1
                $sText = StringRegExpReplace($sText, '(TITLE\h*?")"', '${1}' & $TSong[$i] & '"', 1)
            Next
            ClipPut($sText)
			If BitAND(WinGetState($hWnd), 16) Then ContinueCase
            _Send('v{HOME}')
            ContinueCase
        Case Else
            ClipPut($sData)
            Exit
    EndSelect
EndIf

Func _FixAccelHotKeyLayout()
    Static $iKbrdLayout, $aKbrdLayouts
    If Execute('@exitMethod') <> '' Then
        Local $iUnLoad = 1
        For $i = 1 To $aKbrdLayouts[0]
            If Hex($iKbrdLayout) = Hex('0x' & StringRight($aKbrdLayouts[$i], 4)) Then
                $iUnLoad = 0
                ExitLoop
            EndIf
        Next
        If $iUnLoad Then
            _WinAPI_UnloadKeyboardLayout($iKbrdLayout)
        EndIf
        Return
    EndIf
    $iKbrdLayout = 0x0409
    $aKbrdLayouts = _WinAPI_GetKeyboardLayoutList()
    _WinAPI_LoadKeyboardLayout($iKbrdLayout, $KLF_ACTIVATE)
    OnAutoItExitRegister('_FixAccelHotKeyLayout')
EndFunc

Func _Send($Letter)
    SendKeepActive($hWnd)
    Send('{CTRLDOWN}a' &$Letter& '{CTRLUP}')
    SendKeepActive('')
EndFunc

Скрипт срабатывает сразу при запуске (в отличие от предыдущего варианта, где нужно было нажимать "F1") и затем закрывается. Заводите на "KeyMan" и пользуйтесь.
Работает со всеми окнами, в названии класса которых есть "Pad". Проверял на штатном блокноте, Notepad2, AkelPad и Notepad++.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Alexey
Вот читаю и диву даюсь. Ну да ладно.
Спрашиваю я, потому что не пойму, привязываться к блокноту обязательно?
Вот (как пример) скрипт в несколько строк, который вставляет название трека в заголовок.
Код:
Global $j, $sData

$sFileIn  = "example.txt"
$sFileOut = "replace.txt"

$sText = FileRead($sFileIn)

; array with the names of songs
$aSongName = StringRegExp($sText, "(?<=\n)(\w.*)", 3)
; array of technical information about the songs
$aSongInfo = StringRegExp($sText, "FILE.*|\s+TRACK.*|\s+TITLE\s+""""|\s+INDEX.*", 3)

For $i = 0 To UBound($aSongInfo) -1
	If StringInStr($aSongInfo[$i], "TITLE", 1) Then
		$sData &= StringReplace($aSongInfo[$i],  '""', '"'& $aSongName[$j] &'"')
		$j += 1
	Else
		$sData &= $aSongInfo[$i]
	EndIf
Next

$hFile = FileOpen($sFileOut, 2)
FileWrite($hFile, $sData)
FileClose($hFile)


Добавлено:
Сообщение автоматически объединено:

Alexey [?]
Такой вариант вас устроит.
Код:
#include <GuiListView.au3>

$iExit = 0
$iTrigger = 1
$sTitle= "[TITLE:Добавление нового торента; CLASS:#32770]"
$sCntrl = "[CLASS:SysListView32; INSTANCE:1]"
HotKeySet("{ESC}", "_Exit")

; Читаем допустимые расширения файлов
$sExe = IniRead("options.ini", "allowable", "exe", "not fount")
If $sExe == "not fount" Then
	MsgBox(16, @ScriptName, "Problems in the ini file!")
	Exit
EndIf

; При каждом добавление торрент файла (в ручную), отмеченными останутся только допустимые файлы для скачивания.
; ВНИМАНИЕ!!! Скрипт автоматизирует только снятие отметок с файлов.
; Выход из скрипта "ESC"
Do
	If Not WinActive($sTitle) Then
		$iTrigger  = 1
	Else
		If $iTrigger Then
			$iCount = ControlListView($sTitle, "", $sCntrl, "GetItemCount")

			Global $aItems[$iCount][2], $j

			$hCntrl = ControlGetHandle($sTitle, "", $sCntrl)
			For $i = 0 To $iCount -1

				$sText = ControlListView($sTitle, "", $sCntrl, "GetText", $i, 0)
				If StringRegExp($sText, "\.("& $sExe &")$", 0) Then
					; this is maybe a log file
				Else
					If _GUICtrlListView_GetItemChecked($hCntrl, $i) Then
						 _GUICtrlListView_SetItemChecked($hCntrl, $i, False)
					EndIf
				EndIf
			Next
			$iTrigger = 0
		EndIf
	EndIf

	Sleep(250)
Until $iExit

Func _Exit()
	$iExit = 1
EndFunc

options.ini
INI:
[allowable]
exe=flac|mp3|ogg
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Alofa сказал(а):
Заводите на "KeyMan" и пользуйтесь
пользоваться пока не могу - в нужном активном окне блокнота2 скрипт не делает ничего, при этом каждый раз (я 4 раза проверял) почему-то "позволяет себе" активировать другие свёрнутые (на панели задач) окна блокнота2 и выделять в них всё содержимое, а в самом первом случае - ещё и что-то менять в самом текстовом документе

может быть, стоило бы это всё реализовать так, чтобы скрипт не искал никаких там символов "Pad" в классах окон (а просто бы отрабатывал в текущем активном окне)?

Garrett сказал(а):
Такой вариант вас устроит
OffTopic:
основоположная идея состояла в том, чтобы
даже не отображать
строки, содержащие файлы с ненужными расширениями
(в предложенном же виде проблема почти никак не решается, поэтому его я даже не проверял)

раз средствами auto-it'a нереально найти полноценное решение, то может быть возможно хотя бы такое примитивное действие как закрашивание в белый цвет всех вышеупомянутых строк? смысл в том, чтобы все символы таких строк абсолютно совпадали по цвету с белым фоном списка и совсем не бросались в глаза. результат выглядеть будет не особо приятно, решением не станет, но вдруг на практике это окажется лучше чем ничего?
 
A

Alofa

Гость
Alexey
Немного изменил код в своем предыдущем ответе #11.
Там вы увидите следующие строки:
Код:
$hWnd = WinGetHandle($Window)
If $hWnd Then
    If BitAND(WinGetState($hWnd), 16) Then Exit ; Если все окна скрыты - то Выход.
    WinActivate($hWnd)
Else
    Exit ; Если окно не существует - то Выход.
EndIf

Так мы проверяем существование окна блокнота. Т.е. функция " WinGetHandle()" сначала ищет окно соответствующее критерию в верхнем уровне (среди видимых), если не находит - то ищет среди свернутых и скрытых. Если найденных окон несколько в данном уровне, то обращается к окну, которое было открыто или редактировалось последним. Далее мы проверяем состояние найденного окна и если оно скрыто - то выходим из программы.

Если вас такой подход не устраивает, то замените вышеописанные строки в скрипте на следующие:
Код:
$hWnd = WinActive($Window)
If Not $hWnd Then Exit

Здесь функция " WinActive()" проверяет именно активность искомого окна и если не находит - то делает выход.
Минус (по крайней мере для меня) в таком подходе состоит в том, что окно должно быть самым "наиактивнейшим" в ОС на данный момент. То есть если вы активируете окно блокнота и запустите программу двойным кликом мышки (а не при помощи горячих клавиш), то ничего не произойдет.

Плюс в том же скрипте вы найдете строки:
Код:
;~ 			$sTextMod = StringRegExp($sText, '((.*\R\h+?)+' &$TSong[0]&')', 1)
;~ 			If IsArray($sTextMod) Then $sText = $sTextMod[0]

Разкомментируйте их, если хотите чтобы из итогового листа блокнота удалялся нижний блок строк с названиями треков.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
Alofa, благодарю, скрипт работает
- 7 строк заменил на 2
- другие 2 строки раскомментировал. наличие символа ~ несколько смутило, так я думал, что для комментирования всегда достаточно символа ;
в общем, просто убрал оба символа в обеих строках

- порадовало, что не нужно даже выделять нижний блок (с названия песен)
- огорчило, что в течение примерно полусекунды (после нажатия заданного сочетания клавиш и до перемещения названий песен) всё содержимое текстового документа выделяется и тут же выделение убирается. выглядит как большое тёмное мерцание. реально ли не заморачиваясь и ничего особо не меняя его избежать?
 
A

Alofa

Гость
Пробуйте:
Код:
#include <Array.au3>
#include <WinAPISys.au3>

Global $hWnd, $sData, $Window = '[REGEXPCLASS:Notepad2]'

$hWnd = WinActive($Window)
If Not $hWnd Then Exit

_FixAccelHotKeyLayout() ; Инфо по функции: http://autoit-script.ru/index.php?topic=5745.15

$sData = ClipGet()
Send('!c')

Local $TSong, $Size, $sTextMod, $sText = ClipGet()
If $sText Then
    $Pos = StringInStr($sText, 'INDEX', 2, -1)
    $TSong = StringRegExp($sText, '\h*(.*[^\v|\h])', 3, $Pos)
    $Size = UBound($TSong)
    Select
		Case $Size > 1 And Not @error
			$sTextMod = StringRegExp($sText, '((.*\R\h+?)+' &$TSong[0]&')', 1)
			If IsArray($sTextMod) Then $sText = $sTextMod[0]
            For $i = 1 To $Size - 1
                $sText = StringRegExpReplace($sText, '(TITLE\h*?")"', '${1}' & $TSong[$i] & '"', 1)
            Next
            ClipPut($sText)
			If BitAND(WinGetState($hWnd), 16) Then ContinueCase
            _Send('{CTRLDOWN}av{HOME}{CTRLUP}')
            ContinueCase
        Case Else
            ClipPut($sData)
            Exit
    EndSelect
EndIf

Func _FixAccelHotKeyLayout()
    Static $iKbrdLayout, $aKbrdLayouts
    If Execute('@exitMethod') <> '' Then
        Local $iUnLoad = 1
        For $i = 1 To $aKbrdLayouts[0]
            If Hex($iKbrdLayout) = Hex('0x' & StringRight($aKbrdLayouts[$i], 4)) Then
                $iUnLoad = 0
                ExitLoop
            EndIf
        Next
        If $iUnLoad Then
            _WinAPI_UnloadKeyboardLayout($iKbrdLayout)
        EndIf
        Return
    EndIf
    $iKbrdLayout = 0x0409
    $aKbrdLayouts = _WinAPI_GetKeyboardLayoutList()
    _WinAPI_LoadKeyboardLayout($iKbrdLayout, $KLF_ACTIVATE)
    OnAutoItExitRegister('_FixAccelHotKeyLayout')
EndFunc

Func _Send($Letter)
    SendKeepActive($hWnd)
    Send($Letter)
    SendKeepActive('')
EndFunc

Alexey сказал(а):
огорчило, что в течение примерно полусекунды (после нажатия заданного сочетания клавиш и до перемещения названий песен) всё содержимое текстового документа выделяется и тут же выделение убирается.
Во-первых промаргивание будет всегда, потому что скрипт эмулирует нажатие комбинаций клавиш, одно из которых Ctrl+A (выделить все).
Во вторых у вас все работает медлено, потому что тратится время на срабатывание самой "KeyMan" + запуск данной программы (+ работа антивируса) + срабатывание данной программы.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
скрипт не справился с переносом такого односимвольного названия песни как 0
оно просто пропустилось и все последующие названия были перенесены не в нужное место, а на одну позицию выше
при этом последний трэк остался вообще без названия

более того, если экспериментально изменить 0 на, например, 01 (или 1999, или 25), то перенос тоже получается неприемлемым, но по-другому:
Код:
  TRACK 05 AUDIO
    "
    INDEX 01 21:26:71
а должно быть вот так:
Код:
  TRACK 05 AUDIO
    TITLE "0"
    INDEX 01 21:26:71


если же изменить 0 на, например, 0abc, то получается:
Код:
  TRACK 05 AUDIO
    abc"
    INDEX 01 21:26:71

вот для удобства копия всего скрипта, которым пользуюсь и который до этого случая я считал полностью рабочим:
Код:
#include <Array.au3>
#include <WinAPISys.au3>

Global $hWnd, $sData, $Window = '[REGEXPCLASS:(?i).*?Pad.*?]'

$hWnd = WinActive($Window)
If Not $hWnd Then Exit

_FixAccelHotKeyLayout()

$sData = ClipGet()
_Send('c')

Local $TSong, $Size, $sTextMod, $sText = ClipGet()
If $sText Then
    $Pos = StringInStr($sText, 'INDEX', 2, -1)
    $TSong = StringRegExp($sText, '.+[^\v]', 3, $Pos)
    $Size = UBound($TSong)
    Select
        Case $Size > 1 And Not @error
          $sTextMod = StringRegExp($sText, '((.*\R\h+?)+' &$TSong[0]&')', 1)
          If IsArray($sTextMod) Then $sText = $sTextMod[0]
            For $i = 1 To $Size - 1
                $sText = StringRegExpReplace($sText, '(TITLE\h*?")(")', '\1' & $TSong[$i] & '\2', 1)
            Next
            ClipPut($sText)
            If BitAND(WinGetState($hWnd), 16) Then ContinueCase
            _Send('v{HOME}')
            ContinueCase
        Case Else
            ClipPut($sData)
            Exit
    EndSelect
EndIf

Func _FixAccelHotKeyLayout()
    Static $iKbrdLayout, $aKbrdLayouts
    If Execute('@exitMethod') <> '' Then
        Local $iUnLoad = 1
        For $i = 1 To $aKbrdLayouts[0]
            If Hex($iKbrdLayout) = Hex('0x' & StringRight($aKbrdLayouts[$i], 4)) Then
                $iUnLoad = 0
                ExitLoop
            EndIf
        Next
        If $iUnLoad Then
            _WinAPI_UnloadKeyboardLayout($iKbrdLayout)
        EndIf
        Return
    EndIf
    $iKbrdLayout = 0x0409
    $aKbrdLayouts = _WinAPI_GetKeyboardLayoutList()
    _WinAPI_LoadKeyboardLayout($iKbrdLayout, $KLF_ACTIVATE)
    OnAutoItExitRegister('_FixAccelHotKeyLayout')
EndFunc

Func _Send($Letter)
    SendKeepActive($hWnd)
    Send('{CTRLDOWN}a' &$Letter& '{CTRLUP}')
    SendKeepActive('')
EndFunc
 
A

Alofa

Гость
Замените строку:
Код:
$TSong = StringRegExp($sText, '.+[^\v]', 3, $Pos)

На эту:
Код:
$TSong = StringRegExp($sText, '.*\V', 3, $Pos)

Сейчас нет возможности проверить. Отпишитесь, что получилось.
 
Автор
A

Alexey

Новичок
Сообщения
171
Репутация
0
строку заменил и проверил 2 названия:
1) вместо
Код:
  TRACK 05 AUDIO
    TITLE "0"
    INDEX 01 04:00:00
получилось:
Код:
  TRACK 05 AUDIO
    "
    INDEX 01 04:00:00

2) вместо
Код:
  TRACK 08 AUDIO
    TITLE "19 Again"
    INDEX 01 07:00:00
получилось:
Код:
  TRACK 08 AUDIO
     Again"
    INDEX 01 07:00:00

похоже, скрипту любые цифры в самом начале названия не нравятся
 
Верх