Да, это то, что я хотел. Только мне кажется, что где-то в скрипте ошибка закралась, потому, что одна из папок добавляется в .exe и создается ее .fdi но не копируется при запуске.Именно это я и хотел добиться изначально...
Переделал немного концепцию, теперь для получения списка файлов и папок используется _FileListToArrayRec.
Также показан пример удаления папки с файлами после обработки:
Код:#include <File.au3> OnAutoItExitRegister('_OnExit') Global $sDest = @ScriptDir & '\Files' If Not @Compiled And MsgBox(36, @ScriptName, 'Prepare the script for compilation?' & @CRLF & @CRLF & 'YES --> Executes _FileDirInstall' & @CRLF & 'NO --> Executes script body') = 6 Then _FileDirInstall(@ScriptDir & '\123', $sDest & '\123', 0, '*', 1, -1) _FileDirInstall(@ScriptDir & '\456', $sDest & '\456', 0, '*', 1, -1) _FileDirInstall(@ScriptDir & '\789', $sDest & '\789', 0, '*', 1, -1) Exit EndIf ;===== YOUR SCRIPT CONTENT GOES HERE ===== MsgBox(64, @ScriptName, 'My script', 0, Default) ;===== YOUR SCRIPT CONTENT GOES HERE ===== Func _OnExit() DirRemove($sDest, 1) EndFunc Func _FileDirInstall($sSrc, $sDest, $nFlag = 0, $sMask = '*', $iSubDirs = 0, $sIncludeName = -1) Local $aList, $sData, $sDirs, $sRead, $hFile If @Compiled Then Return SetError(-1) EndIf If StringStripWS($sIncludeName, 8) = '' Then $sIncludeName = 'InstalledDir' ElseIf $sIncludeName = -1 Then $sIncludeName = 'InstalledDir_' & StringRegExpReplace($sSrc, '^.*\\', '') EndIf $sIncludeName &= '.fdi' $aList = _FileListToArrayRec($sSrc, $sMask, 0, $iSubDirs) If @error Then Return SetError(1) EndIf $sDest = __GetMacros($sDest) For $i = 1 To $aList[0] If StringInStr(FileGetAttrib($sSrc & '\' & $aList[$i]), 'D') And Not StringInStr($sDirs, 'DirCreate(' & $sDest & ' & "\' & $aList[$i] & '")' & @CRLF) Then $sDirs &= 'DirCreate(' & $sDest & ' & "\' & $aList[$i] & '")' & @CRLF ContinueLoop EndIf $sData &= 'FileInstall("' & $sSrc & '\' & $aList[$i] & '", ' & $sDest & ' & "\' & $aList[$i] & '", ' & $nFlag & ')' & @CRLF Next $sData = $sDirs & $sData If $sData = '' Then Return SetError(2) EndIf $hFile = FileOpen(@ScriptDir & '\' & $sIncludeName, 2) FileWrite($hFile, '#include-once' & @CRLF & @CRLF & $sData) FileClose($hFile) $sRead = FileRead(@ScriptFullPath) If Not StringInStr($sRead, '#include "' & $sIncludeName & '"' & @CRLF) Then $hFile = FileOpen(@ScriptFullPath, 2) FileWrite($hFile, '#include "' & $sIncludeName & '"' & @CRLF & $sRead) FileClose($hFile) EndIf Return 1 EndFunc Func __GetMacros($sStr) Local $aMacros = _ StringSplit( _ 'ScriptDir|TempDir|StartupCommonDir|ProgramsCommonDir|StartMenuCommonDir|AppDataCommonDir|DesktopCommonDir|DocumentsCommonDir|FavoritesCommonDir|' & _ 'DesktopDir|MyDocumentsDir|FavoritesDir|StartupDir|ProgramsDir|StartMenuDir|AppDataDir|UserProfileDir|' & _ 'CommonFilesDir|ProgramFilesDir|SystemDir|WindowsDir|HomePath|HomeShare|HomeDrive', _ '|') Local $sMacros For $i = 1 To $aMacros[0] $sMacros = Execute('@' & $aMacros[$i]) If StringInStr($sStr, $sMacros) Then Return StringRegExpReplace(StringReplace($sStr, $sMacros, '@' & $aMacros[$i] & ' & "', 1, 2) & '"', ' & ""$', '') EndIf Next Return '"' & $sStr & '"' EndFunc
upd из последних наблюдений, если в папке нет подпапок с файлами а только файлы, то DirCreate не создается в .fdi и соответственно файлы не копируются. Если в папке кроме файлов есть и подпапки, то соответственно DirCreate создает этот путь и тогда копируются и файлы. как то так.
upd 2 И еще один момент, когда я добавляю свои папки и фалы в .exe а потом при запуске копирую их в нужные директории, то по понятным причинам, сбрасываются атрибуты файлов и папок, это можно как-то пофиксить?
Последнее редактирование: