ViSiToR
![](http://forum.ru-board.com/board/avatars/private/ViSiToR.gif)
Silver Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Artem_Butenko Два варианта: 1) Генерирует и добавляет для текущего скрипта список FileInstall'ов: Код: _FileDirInstall(@ScriptDir & '\Resources', @TempDir) ;===== YOUR SCRIPT CONTENT GOES HERE ===== ;===== YOUR SCRIPT CONTENT GOES HERE ===== Func _FileDirInstall($sDirPath, $sDest, $nFlag = 0, $sMask = '*', $iSubDirs = 0, $sIncludeName = -1) Local $aList, $aMacros, $sMacros, $sData, $sReadScript, $hFile If @Compiled Then Return SetError(-1) EndIf If StringStripWS($sIncludeName, 8) = '' Then $sIncludeName = 'InstalledDir' ElseIf $sIncludeName = -1 Then $sIncludeName = 'InstalledDir_' & StringRegExpReplace($sDirPath, '^.*\\', '') EndIf $sIncludeName &= '.fdi' $aList = __FileSearch($sDirPath, $sMask, 1, $iSubDirs, 0) If @error Then Return SetError(1) EndIf $aMacros = _ StringSplit( _ 'AppDataCommonDir|DesktopCommonDir|DocumentsCommonDir|FavoritesCommonDir|ProgramsCommonDir|StartMenuCommonDir|' & _ 'StartupCommonDir|AppDataDir|DesktopDir|MyDocumentsDir|FavoritesDir|ProgramsDir|StartMenuDir|StartupDir|UserProfileDir|' & _ 'HomeDrive|HomePath|HomeShare|ProgramFilesDir|CommonFilesDir|WindowsDir|SystemDir|TempDir', _ '|') For $i = 1 To $aMacros[0] $sMacros = Execute('@' & $aMacros[$i]) If $sDest = $sMacros Then $sDest = StringReplace($sDest, $sMacros, '@' & $aMacros[$i]) EndIf Next For $i = 1 To $aList[0] If $iSubDirs = 1 Then $sData &= 'FileInstall("' & $aList[$i] & '", ' & $sDest & ' & "\' & StringRegExpReplace($aList[$i], '^.*\\', '') & '", ' & $nFlag & ')' & @CRLF Else $sData &= 'FileInstall("' & $sDirPath & '\' & $aList[$i] & '", ' & $sDest & ' & "\' & $aList[$i] & '", ' & $nFlag & ')' & @CRLF EndIf Next If $sData = '' Then Return SetError(2) EndIf $hFile = FileOpen(@ScriptDir & '\' & $sIncludeName, 2) FileWrite($hFile, '#include-once' & @CRLF & @CRLF & $sData) FileClose($hFile) $sReadScript = FileRead(@ScriptFullPath) If Not StringInStr($sReadScript, '#include "' & $sIncludeName & '"' & @CRLF) Then $hFile = FileOpen(@ScriptFullPath, 2) FileWrite($hFile, '#include "' & $sIncludeName & '"' & @CRLF & $sReadScript) FileClose($hFile) EndIf Return 1 EndFunc Func __FileSearch($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0) Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib, $sFiles If Not StringInStr(FileGetAttrib($sPath), "D") Then Return SetError(1, 0, 0) EndIf If $iSubDir = 1 Then $sAttrib &= ' /S' EndIf If $iSort = 1 Then $sAttrib &= ' /O:N' EndIf Switch $iFlag Case 1 $sAttrib &= ' /A-D' Case 2 $sAttrib &= ' /AD' Case Else $sAttrib &= ' /A' EndSwitch $sOut = StringToBinary('0' & @CRLF, 2) $sPath = StringRegExpReplace($sPath, '\\+$', '') $sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '') $sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';') $aMasks = StringSplit($sFileMask, ';') For $i = 1 To $aMasks[0] If StringStripWS($aMasks[$i], 8) = "" Then ContinueLoop EndIf $sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"' If $i < $aMasks[0] Then $sFiles &= ';' EndIf Next $hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6) While 1 $sRead = StdoutRead($hDir, False, True) If @error Then ExitLoop EndIf If $sRead <> "" Then $sOut &= $sRead EndIf Wend $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3) If @error Or UBound($aOut) < 2 Then Return SetError(2, 0, 0) EndIf $aOut[0] = UBound($aOut)-1 Return $aOut EndFunc | 2) Генерирует список FileInstall'ов и возвращает его в переменной: Код: #include <File.au3> $sRet_FI_Lines = _FileInstallGetFolder("C:\Temp", "D:\Dest", 0, "*.txt") ConsoleWrite("+Return:" & @CRLF & $sRet_FI_Lines & @CRLF & @CRLF & "!Error = " & @error & @CRLF & @CRLF) ;~ MsgBox(64, "Return #1:", $sRet_FI_Lines & @CRLF & @CRLF & "!Error = " & @error) $sRet_FI_Lines = _FileInstallGetFolder(_PathFull(@AutoItExe & "\.."), "$aDest[$i]", 1, "*.exe") ConsoleWrite("+Return:" & @CRLF & $sRet_FI_Lines & @CRLF & @CRLF & "!Error = " & @error & @CRLF & @CRLF) ;~ MsgBox(64, "Return #2:", $sRet_FI_Lines & @CRLF & @CRLF & "!Error = " & @error) Func _FileInstallGetFolder($sSource, $sDest, $nFlag = 0, $sMask = "*", $nCompiled = False) Local $hSearch, $sNext_File, $sRet_FI_Lines = "" If (Not $nCompiled) Or ($nCompiled And @Compiled) Then $hSearch = FileFindFirstFile($sSource & "\" & $sMask) If $hSearch = -1 Then Return SetError(1, 0, "") ;Check if it's a $Var (or $Array[$i][N]...) Local $iAddAsVar = StringRegExp($sDest, "\A(\$\w+(\[(\$\w+|\d+)\])*?|@\w+)$") While 1 $sNext_File = FileFindNextFile($hSearch) If @error Then ExitLoop ;No more files EndIf If $sSource = @ScriptDir And $sNext_File = @ScriptName Then ContinueLoop EndIf If $iAddAsVar Then $sRet_FI_Lines &= 'FileInstall("' & $sSource & '\' & $sNext_File & '", ' & _ $sDest & ' & "\' & $sNext_File & '", ' & $nFlag & ')' & @CRLF Else $sRet_FI_Lines &= 'FileInstall("' & $sSource & '\' & $sNext_File & '", "' & _ $sDest & '\' & $sNext_File & '", ' & $nFlag & ')' & @CRLF EndIf WEnd FileClose($hSearch) EndIf If $sRet_FI_Lines = "" Then Return SetError(2, 0, "") Return StringStripWS($sRet_FI_Lines, 3) EndFunc |
---------- ViSiToR a.k.a CreatoR CreatoR это не ник, CreatoR это стиль жизни! |
|