- Сообщения
- 8,673
- Репутация
- 2,486
FileInstall работает исключительно с файлами, и сложность заключается в том, что там нужно указывать полные пути на момент компиляции.Дело в том, что мне нужно добавить не файл file1.au3 в .exe а саму папку 123 с ее содержимым
Я в своё время написал некий обработчик, который генерирует "на лету" нужные строчки с путями для FileInstall, перед компиляцией и после любого изменения папки, скрипт нужно хотя бы один раз запустить (можно по условию, например если передан некий параметр - его можно указать в параметрах запуска из SciTE по Shift + F8):
Код:
;Указываем в параметрах запуска /DirInstall чтобы данная инструкция вызывалась только при его использовании, и тогда остальной скрипт выполняться не будет
If $CmdLine[0] And $CmdLine[1] = '/DirInstall' Then
_FileDirInstall(@ScriptDir & '\123', @ScriptDir & '\123', 0, '*', 1, 'DirInstall')
Exit
EndIf
;===== Тут тело скрипта =====
;===== Конец тело скрипта =====
Func _FileDirInstall($sDirPath, $sDest, $nFlag = 0, $sMask = '*', $iSubDirs = 0, $sIncludeName = -1)
Local $aList, $sData, $sDir, $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
$sDest = __GetMacros($sDest)
For $i = 1 To $aList[0]
If Not StringInStr($sData, 'DirCreate(' & $sDest & ')' & @CRLF) Then
$sData &= 'DirCreate(' & $sDest & ')' & @CRLF
EndIf
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 ProcessExists($hDir)
$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
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
Последнее редактирование: