Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] генерация fileinstall (http://forum.oszone.net/showthread.php?t=136242)

morgan1991 30-03-2009 02:41 1078563

генерация fileinstall
 
Здравствуйте очередной раз!
Мне опять понадобилась помощь. Нужна программка на автоите которая бы генерировала код на автоите следующего характера:

Допустим есть папка тест в ней несколько файлов, после указания программе этой папки она должна сгенерировать следующее:
Код:

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)
Помогите пожалуйста. Как можно такое реализовать?

proxy 30-03-2009 03:44 1078579

Код:

#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 1078819

Спасибо всё отлично. Только вот видел бы он ещё вложенные папки и в них тоже самое.

proxy 30-03-2009 18:53 1079252

Код:

#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



Время: 15:16.

Время: 15:16.
© OSzone.net 2001-