Что нового

Запуск файла по шаблону.

Alkantel

Новичок
Сообщения
45
Репутация
1
Добрый день.
Есть имя вида "SetupAPP v1.001.23.exe", пытаюсь запустить его при помощи команды
Код:
run("(?:.*?\s.\d+)\.exe")
Реакции ноль. Где я ошибся?
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Alkantel
:laugh: так вы вряд ли что-то запустите, используйте функцию
Код:
_FO_FileSearch()

Для поиска имен файлов, и если они соответствуют шаблону то запускать их.
OffTopic:
Функция _FO_FileSearch() документируется в файле справки(Раздел "Функции пользователей -> Файлы, каталоги -> FileOperations") от AZJIO ее можно скачать Тут вместе с include'ми



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

Код:
#include<FileOperations.au3>
$path=@ScriptDir
$aFile=_FO_FileSearch($path,"*.exe",true,125,1,2)
Global $aSFile[UBound($aFile)]
Global $patterka="(?:.*?\s.\d+)\"
For $i=0 To UBound($aFile)-1
	Local $fName=_FO_PathSplit($aFile[$i])
	If StringRegExp($fName[1],$patterka,0) Then
		$aSFile[$i]=$aFile[$i]
	EndIf
Next
#cs
В итоге скорее всего(т.к. не тестировал) в массиве $aSFile будут только 
те файлы которые соответствуют регулярному выражению
Запустить их можно будет например вот так:
For $i=0 to ubound($aSFile)-1
	run($aSFile[$i]);Пустые ячейки команда все равно не запустит
next
#ce

Скорее всего вот так, если регулярный шаблон не совсем правилен(скопировал с вашего 1 сообщения) то поправьте и протестируйте
 
Автор
Alkantel

Alkantel

Новичок
Сообщения
45
Репутация
1
CreatoR , это Вы про то что там не указана возможность использования регулярок и переменных?

MnM, не работает скриптик. Постоянно эта ошибка "Error: Expected a "=" operator in assignment statement" Но и на том спасибо. Буду копать дальше.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Alkantel
Код:
#Include <Array.au3>

Global Const $_sDir = @ScriptDir

Global $_aResult = StringSplit(  __GetFileList( $_sDir ), '|' ), $_aTmp
_ArrayDisplay( $_aResult )
; ---
For $Idx = 1 To $_aResult[0] Step 1
	$_aTmp = StringRegExp( $_aResult[$Idx], 'твое регулярное выражение' )
	If $_aTmp Then
		Run( $_sDir & '\' & $_aResult[$Idx], @ScriptDir )
	    ExitLoop
	ElseIf $Idx = $_aResult[0] Then
		Exit MsgBox( 16, '', 'Файл не найден.' )
	EndIf
Next
MsgBox( 64, '', 'Файл запущен!' )


Func __GetFileList( $sPath, $sFilter = '*', $iFlag = 0)
	Local $hSearch, $sFile, $sFileList

	$sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\"
	If Not FileExists($sPath) Then _
		Return SetError(1, 1, "")
	If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then _
		Return SetError(2, 2, "")
	If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then _
		Return SetError(3, 3, "")

	$hSearch = FileFindFirstFile($sPath & $sFilter)
	If @error Then Return _
		SetError(4, 4, "")

	While 1
		$sFile = FileFindNextFile($hSearch)
		If @Error Then _
			ExitLoop
		If ($iFlag + @Extended = 2) Then _
			ContinueLoop

		$sFileList &= '|' & $sFile
	WEnd
	FileClose($hSearch)

	If Not $sFileList Then _
		Return SetError(4, 4, "")

	Return StringTrimLeft($sFileList, 1)
EndFunc   ;==>__GetFileList
 
Автор
Alkantel

Alkantel

Новичок
Сообщения
45
Репутация
1
firex , и что же оно делает? Мне был предоставлен список ВСЕХ файло в директории, после закрытия списка окшко с "Файл не найден".
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
создавайте в следующий раз тогда тему в заказах, раз вы не в состоянии заменить одну строку. Вместо слов ваш паттерн впишите свой, а файл положите в папку со скриптом.
 
Автор
Alkantel

Alkantel

Новичок
Сообщения
45
Репутация
1
Оскорбляете, да =) Я пока что читать умею. вставил регулярку куда надо. Вышло то что напмсал. Но у меня нету Array.au3, может в этом проблемка.

А за идейку про заказы спасибо, но это крайний случай.
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Alkantel
Можно так:
Код:
#include <FileOperations.au3>
#include <Array.au3>

#AutoIt3Wrapper_Run_AU3Check=n
#AutoIt3Wrapper_Run_Tidy=y

Global $aRez[1], $aRezSerch[1], $aArray = DriveGetDrive("FIXED")

If @error Then Exit

For $i = 1 To UBound($aArray) - 1
	$aRezSerch = _FO_FileSearch($aArray[$i], "*.exe", True, 0)
	For $j = 1 To UBound($aRezSerch) - 1
		_ArrayAdd($aRez, $aRezSerch[$j])
	Next
Next

For $i = 1 To UBound($aRez) - 1
	If StringRegExp($aRez[$i], '(?i).*?(\S+?\s?v\d+?[\.]\d+?[\.]\d+?[\.]exe)', 0) = 1 Then Run($aRez[$i])
Next
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Alkantel [?]
это Вы про то что там не указана возможность использования регулярок и переменных?
Ну почему, переменные там поддерживаются.
 
Автор
Alkantel

Alkantel

Новичок
Сообщения
45
Репутация
1
CreatoR я знаю что переменніе поддерживаются. но там о них не записано. Но если значение переменной является регулярное выражение, то это не работает. Странно, но что же. Буду искать выход.

ivsatel , утром проверю и отпишусь.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Alkantel [?]
там о них не записано
Это и без записи понятно.

если значение переменной является регулярное выражение, то это не работает
И не должно.
Ты должен знать что у тебя записано в переменной, и также должен знать, что функция Run не поддерживает рег. выражения, в том числе переданные в переменной (это также если бы запись была литеральной - прямой).
 
Автор
Alkantel

Alkantel

Новичок
Сообщения
45
Репутация
1
ivsatel не работает. Видимо это никак не провернуть. Жаль.

З.Ы. Тему можно удалить, так-как она бесполезна.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Alkantel [?]
ivsatel не работает. Видимо это никак не провернуть. Жаль.З.Ы. Тему можно удалить, так-как она бесполезна.
В этой теме есть решение для тех людей, которые умеют читать. Удалять ее совсем не обязательно.

Все 3 решения верны и работоспособны.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
firex
У меня не совсем верное, _FO_PathSplit забыл в регулярную функцию включить индекс ячейки, сейчас подправлю=)


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

Alkantel сказал(а):
Постоянно эта ошибка "Error: Expected a "=" operator in assignment statement"
Это вы просто в $path переменную не присвоили путь который нужен например:
Код:
$path=@scriptdir
$path="C:\user"
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
_Run( 'папка для поиска', 'паттерн' ) ;Уберите все параметры если не знаете что вписать. И положите в папку со скриптом любой exe.
If @Error Then
    MsgBox( 16, 'Error', 'Error code: ' & @Error )
EndIf

Func _Run( $_sDir = @ScriptDir, $_sPatternName = '([^\.]+\.exe)$', $_sWorkDir = @ScriptDir, $_vShowFlag = @SW_SHOW, $_vOptFlag = Default )
	Local $_aResult = StringSplit( __GetFileList( $_sDir ), '|' ), $_aTmp, $_iPid

	For $Idx = 1 To $_aResult[0] Step 1
		$_aTmp = StringRegExp( $_aResult[$Idx], $_sPatternName )
		If $_aTmp Then
			$_iPid = Run( $_sDir & '\' & $_aResult[$Idx], $_sWorkDir, $_vShowFlag, $_vOptFlag )
			Return SetError( @Error, 0, $_iPid )
		ElseIf $Idx = $_aResult[0] Then
			Return SetError( -1, 0, 0 )
		EndIf
	Next
EndFunc

Func __GetFileList( $sPath, $sFilter = '*', $iFlag = 0)
    Local $hSearch, $sFile, $sFileList

    $sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") & "\"
    If Not FileExists($sPath) Then _
        Return SetError(1, 1, "")
    If StringRegExp($sFilter, "[\\/:><\|]|(?s)\A\s*\z") Then _
        Return SetError(2, 2, "")
    If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then _
        Return SetError(3, 3, "")

    $hSearch = FileFindFirstFile($sPath & $sFilter)
    If @error Then Return _
        SetError(4, 4, "")

    While 1
        $sFile = FileFindNextFile($hSearch)
        If @Error Then _
            ExitLoop
        If ($iFlag + @Extended = 2) Then _
            ContinueLoop

        $sFileList &= '|' & $sFile
    WEnd
    FileClose($hSearch)

    If Not $sFileList Then _
        Return SetError(4, 4, "")

    Return StringTrimLeft($sFileList, 1)
EndFunc   ;==>__GetFileList
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Alkantel [?]
у меня нету Array.au3
Он идёт в поставке с AutoIt.

Вот это должно решить проблему:
Код:
_RunWithRegExp(@DesktopDir, '(?i)^.*?\s.[\d\.]+\.exe$')

Func _RunWithRegExp($sPath, $sRegExpName, $sWorkDir = '', $iShowFlags = @SW_SHOW, $iOptFlags = 0)
	Local $hFile, $sNextFile, $iRet
	
	$hFile = FileFindFirstFile($sPath & '\*.*')
	
	If $hFile = -1 Then
		Return SetError(1, 0, 'No files/directories matched the search pattern')
    EndIf
	
	While 1
		$sNextFile = FileFindNextFile($hFile)
		If @error Then ExitLoop
		
		If StringRegExp($sNextFile, $sRegExpName) Then
			$iRet = Run($sPath & '\' & $sNextFile, $sWorkDir, $iShowFlags, $iOptFlags)
			ExitLoop
		EndIf
	WEnd
	
	FileClose($hFile)
	Return $iRet
EndFunc


запускает файл по шаблону рег. выражения, в данном случае запустит файл SetupAPP v1.001.23.exe на рабочем столе.
 
Автор
Alkantel

Alkantel

Новичок
Сообщения
45
Репутация
1
Извините, но ничто из предложенного не заработало.

Удалось запустить файл через такое вот извращение
Код:
$LogFile = "TEMP.txt"
$path00 = "C:\"
$hSearch = FileFindFirstFile ("Setup*exe")
$sName = FileFindNextFile($hSearch)

FileOpen($path00 & "\TEMP.txt", 1)

   $hFile = FileOpen($path00 & $LogFile, 1)
   If $hFile = -1 Then
		 MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
		 Exit
	  EndIf

   FileWriteLine($hFile, $sName)
   
     $hRead = FileReadLine($path00 & $LogFile)
	 
   Run($hRead)
   
FileClose($hSearch)

FileClose($hFile)

Мож кому сгодится :idiot:
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Alkantel

Код:
$hSearch = FileFindFirstFile ("Setup*exe")
$sName = FileFindNextFile($hSearch)
     
Run($sName)


Ваш же пример, только без глупостей.


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

Alkantel [?]
Извините, но ничто из предложенного не заработало.
Специально проверил только что - все варианты работают.
 
Автор
Alkantel

Alkantel

Новичок
Сообщения
45
Репутация
1
Оптимизация, чо. Спасибо. Это явно приятнее и красивее.
 
Верх