Показать полную графическую версию : [решено] генерация fileinstall
morgan1991
30-03-2009, 02:41
Здравствуйте очередной раз!
Мне опять понадобилась помощь. Нужна программка на автоите которая бы генерировала код на автоите следующего характера:
Допустим есть папка тест в ней несколько файлов, после указания программе этой папки она должна сгенерировать следующее:
FileInstall("test_name\file1", $test_var & "\test_name\file1", 1)
FileInstall("test_name\file2", $test_var & "\test_name\file2", 1)
FileInstall("test_name\file3", $test_var & "\test_name\file3", 1)
Причём если папка к примеру находится тут:
C:\tests\dir\
тогда должно получиться так:
FileInstall("dir\file1", $test_var & "\dir\file1", 1)
а не так:
FileInstall("C:\tests\dir\file1", $test_var & "\dir\file1", 1)
Помогите пожалуйста. Как можно такое реализовать?
#region: - Option
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#endregion
#region: - Include
#include <Array.au3>
#endregion
Global $test_var, $aFilesList
Global $sDirPath = @WindowsDir & '\help'
$aFilesList = _CreateInstalFilesList($sDirPath, '*.*')
Switch @Error
Case 0
_ArrayDisplay($aFilesList, '$aFilesList')
_WriteToNotepad($aFilesList)
Case -1
MsgBox(64, 'Внимание', 'В папке назначения нет искомых файлов')
Case 1
MsgBox(64, 'Внимание', 'Ошибка определения нового пути назначения')
EndSwitch
Func _CreateInstalFilesList($sDirFromPath, $sFilesMask)
Global $hSearch, $sFile, $sFilePath, $aResult[1]
$aResult[0] = 0
If StringRight($sDirFromPath, 1) == '\' Then $sDirFromPath = StringTrimRight($sDirFromPath, 1)
$hSearch = FileFindFirstFile($sDirFromPath & '\' & $sFilesMask)
If $hSearch == -1 Then
;~ MsgBox(64, 'Внимание', 'В папке назначения нет искомых файлов')
SetError(-1)
Return -1
EndIf
$sFilePath = StringSplit($sDirFromPath, '\')
If @Error == 1 Then
;~ MsgBox(64, 'Внимание', 'Ошибка определения нового пути назначения')
SetError(1)
Return 1
Else
$sFilePath = $sFilePath[$sFilePath[0]]
EndIf
While 1
$sFile = FileFindNextFile($hSearch)
If @Error Then ExitLoop
If NOT StringInStr(FileGetAttrib($sDirFromPath & '\' & $sFile), 'D') Then
$aResult[0] += 1
ReDim $aResult[$aResult[0]+1]
$aResult[$aResult[0]] = 'FileInstall("' & $sFilePath & '\' & $sFile & '", $test_var & ' & '"\' & $sFilePath & '\' & $sFile & '", 1)'
EndIf
WEnd
FileClose($hSearch)
SetError(0)
Return $aResult
EndFunc
Func _WriteToNotepad(ByRef $aFilesList)
Local $iPid, $iHwd, $i, $sFilesList
$iPid = Run('notepad.exe')
While 1
$iHwd = _ProcessGetWindow($iPid)
If IsHWnd($iHwd) Then ExitLoop
WEnd
WinWait($iHwd)
For $i=1 To $aFilesList[0]
$sFilesList &= $aFilesList[$i]
If $i < $aFilesList[0] Then $sFilesList &= @CRLF
Next
ControlSetText($iHwd, '', '[CLASS:Edit; INSTANCE:1]', $sFilesList)
EndFunc
Func _ProcessGetWindow($iPID, $iRet=1)
Local $aWinList = WinList()
Local $aRet[2]
If IsString($iPID) Then $iPID = ProcessExists($iPID)
For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle
If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]
Return $aRet
EndIf
Next
Return SetError(1, 0, $aRet)
EndFunc
morgan1991
30-03-2009, 12:32
Спасибо всё отлично. Только вот видел бы он ещё вложенные папки и в них тоже самое.
#region: - Option
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#endregion
#region: - Include
;~ #include <Array.au3>
#endregion
Local $aFilesList
Local $sDirWhereSerchPath = @WindowsDir & '\help'
$aFilesList = _GetDirFilesList($sDirWhereSerchPath, '*.*')
If @Error == -1 Then
MsgBox(32, 'Внимание', 'В папке назначения нет искомых файлов')
Exit
EndIf
;~ _ArrayDisplay($aFilesList)
$aFilesList = _CreateFilesList($sDirWhereSerchPath, $aFilesList)
Switch @Error
Case -1
MsgBox(32, 'Внимание', 'Ошибка создания списка:' & @CRLF & 'переданный параметр не массив')
Exit
Case 1
MsgBox(32, 'Внимание', 'Ошибка определения нового пути назначения')
Exit
EndSwitch
;~ _ArrayDisplay($aFilesList)
_WriteToNotepad($aFilesList)
Func _GetDirFilesList($sStartDirPath, $sFilesMask, $iAddFiles=1, $iAddDirs=0, $sRootPath=1)
$sStartDirPath = StringRegExpReplace($sStartDirPath, '\\+$', '')
Local $aRetArray[1], $aSubDirsArr, $sFindNextFile, $sCurrentPath, $iYesAdd
Local $sFindFirstFile = FileFindFirstFile($sStartDirPath & '\' & $sFilesMask)
If @error = 1 Then Return SetError(-1)
If $sRootPath == 1 AND $iAddDirs == 1 Then
$aRetArray[0] += 1
ReDim $aRetArray[2]
$aRetArray[1] = $sStartDirPath
EndIf
While 1
$sFindNextFile = FileFindNextFile($sFindFirstFile)
If @error = 1 Then ExitLoop
$sCurrentPath = $sStartDirPath & '\' & $sFindNextFile
$iYesAdd = 0
If StringInStr(FileGetAttrib($sCurrentPath), 'D') Then
If $iAddDirs == 1 Then $iYesAdd = 1
Else
If $iAddFiles == 1 Then $iYesAdd = 1
EndIf
If $iYesAdd == 1 Then
$aRetArray[0] += 1
ReDim $aRetArray[$aRetArray[0]+1]
$aRetArray[$aRetArray[0]] = $sCurrentPath
EndIf
$aSubDirsArr = _GetDirFilesList($sCurrentPath, $sFilesMask, $iAddFiles, $iAddDirs, 0)
If IsArray($aSubDirsArr) Then
For $i = 1 To $aSubDirsArr[0]
$aRetArray[0] += 1
ReDim $aRetArray[$aRetArray[0]+1]
$aRetArray[$aRetArray[0]] = $aSubDirsArr[$i]
Next
EndIf
WEnd
FileClose($sFindFirstFile)
SetError(0)
Return $aRetArray
EndFunc
Func _CreateFilesList($sStartDirPath, $aFilesPath)
If NOT IsArray($aFilesPath) Then Return SetError(1)
Local $i, $aResult[1], $sFilePath
$aResult[0] = 0
If StringRight($sStartDirPath, 1) == '\' Then $sStartDirPath = StringTrimRight($sStartDirPath, 1)
$sStartDirPath = StringSplit($sStartDirPath, '\')
If @Error == -1 Then Return SetError(-1)
$sStartDirPath = $sStartDirPath[$sStartDirPath[0]-1] & '\' & $sStartDirPath[$sStartDirPath[0]]
For $i=1 To $aFilesPath[0]
$sFilePath = StringRegExpReplace($aFilesPath[$i], '.*(\\' & StringReplace($sStartDirPath, '\', '\\') & ')', '\1', 1)
$aResult[0] += 1
ReDim $aResult[$aResult[0]+1]
$aResult[$aResult[0]] = 'FileInstall("' & $sStartDirPath & '", $test_var & ' & '"' & $sFilePath & '", 1)'
Next
Return $aResult
EndFunc
Func _WriteToNotepad(ByRef $aFilesList)
Local $iPid, $iHwd, $i, $sFilesList
$iPid = Run('notepad.exe')
While 1
$iHwd = _ProcessGetWindow($iPid)
If IsHWnd($iHwd) Then ExitLoop
WEnd
WinWait($iHwd)
For $i=1 To $aFilesList[0]
$sFilesList &= $aFilesList[$i]
If $i < $aFilesList[0] Then $sFilesList &= @CRLF
Next
ControlSetText($iHwd, '', '[CLASS:Edit; INSTANCE:1]', $sFilesList)
EndFunc
Func _ProcessGetWindow($iPID, $iRet=1)
Local $aWinList = WinList()
Local $aRet[2]
If IsString($iPID) Then $iPID = ProcessExists($iPID)
For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle
If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]
Return $aRet
EndIf
Next
Return SetError(1, 0, $aRet)
EndFunc
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.