Что нового

Перемещение пользовательских папок на другой диск

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Дело в том, что мне нужно добавить не файл file1.au3 в .exe а саму папку 123 с ее содержимым
FileInstall работает исключительно с файлами, и сложность заключается в том, что там нужно указывать полные пути на момент компиляции.
Я в своё время написал некий обработчик, который генерирует "на лету" нужные строчки с путями для 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
 
Последнее редактирование:
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
FileInstall работает исключительно с файлами, и сложность заключается в том, что там нужно указывать полные пути на момент компиляции.
Я в своё время написал некий обработчик, который генерирует "на лету" нужные строчки с путями для 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, $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( _
            'ScriptDir|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
 
    If StringLeft($sDest, 1) <> '@' Then
        $sDest = '"' & $sDest & '"'
    EndIf
 
    For $i = 1 To $aList[0]
        If $iSubDirs = 1 Then
            $sData &= 'DirCreate($sDest)' & @CRLF & 'FileInstall("' & $aList[$i] & '", ' & $sDest & ' & "\' & StringRegExpReplace($aList[$i], '^.*\\', '') & '", ' & $nFlag & ')' & @CRLF
        Else
            $sData &='DirCreate($sDest)' & @CRLF &  '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
Запустил по условию с параметром /DirInstall создался файл с путями DirInstall.fdi. Потом скомпилировал скрипт, по размеру .exe файлы добавились. Но при запуске .exe выдает ошибку из-за #include "DirInstall.fdi" в скрипте. Плюс не пойму, как потом из этого скомпилированного .exe извлечь все эти файлы, отредактировать их и по новому скомпилировать скрипт... Заранее прошу прошение за свою тупость (( P.S. я просто в шоке от того, как легко вы во всем этом разбираетесь. Искренне завидую вам.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
при запуске .exe выдает ошибку из-за #include "DirInstall.fdi"
В exe (скомпилированный скрипт) такой ошибки быть не может, т.к все #include заменяются их содержимым. Скорее всего запускается не скомпилированный скрипт, а исходник.

как потом из этого скомпилированного .exe извлечь все эти файлы, отредактировать их и по новому скомпилировать скрипт
Не нужно ничего извлекать, идея в том, что у тебя есть папка с исходником, в которой также есть папка со всеми нужными файлами, и при каждой необходимости что то поменять, просто меняешь в этой самой папке и компилируешь (предварительно один раз запустив исходник с параметром /DirInstall).

Немного подправил код функции выше, там неверно параметры передавались.
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
В exe (скомпилированный скрипт) такой ошибки быть не может, т.к все #include заменяются их содержимым. Скорее всего запускается не скомпилированный скрипт, а исходник.


Не нужно ничего извлекать, идея в том, что у тебя есть папка с исходником, в которой также есть папка со всеми нужными файлами, и при каждой необходимости что то поменять, просто меняешь в этой самой папке и компилируешь (предварительно один раз запустив исходник с параметром /DirInstall).

Немного подправил код функции выше, там неверно параметры передавались.
Спасибо, начинаю понимать. Скажите, на сколько я понял, FileInstall позволяет писать переменные в место распаковки, а в DirInstall.fdi пути записываются конкретные как в первом случае, так и во втором... или так и должно быть? Просто хотелось бы, чтобы распаковывало допустим в @TempDir & '\123' но так пути записываются полные, то этот @TempDir на другом компьютере будет допустим C:\Users\имя пользователя\AppData\Local\Temp и уже будет не стыковка.
Сообщение автоматически объединено:

и еще вопрос, папка в которую распаковываются файлы не удаляется после выполнения скрипта?
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
FileInstall позволяет писать переменные в место распаковки, а в DirInstall.fdi пути записываются конкретные
Нет, только исходный путь указывается полностью без переменных, таковы ограничения функции, в справке это написано.

хотелось бы, чтобы распаковывало допустим в @TempDir & '\123'
Ну так укажи этот путь во втором параметре вызова _FileDirInstall:
Код:
_FileDirInstall(@ScriptDir & '\123', @TempDir & '\123', 0, '*', 1, 'DirInstall')


PS:
Скрипт немного обновил, возможно ты скопировал до замены.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
И ещё раз обновил, теперь должно работать с внешними каталогами.
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
И ещё раз обновил, теперь должно работать с внешними каталогами.
теперь dirinstall.fdi вообще не создается (

Нет, это твоя "ответственность" чистить после себя )).
А как можно это прописать правильно, чтобы после отработки распакованная папка удалялась?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
теперь dirinstall.fdi вообще не создается (
А скрипт запускается с параметром /DirInstall? Просто если указал параметры запуска по Shift + F8, то после закрытия редактора SciTE этот параметр сбрасывается.

как можно это прописать правильно
См. в справке функцию DirRemove.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Для отладки я бы сделал так:
Код:
If Not @Compiled And MsgBox(36, @ScriptName, 'Приготовить скрипт для компиляции?' & @CRLF & @CRLF & 'ДА  --> Запуск функции _FileDirInstall' & @CRLF & 'НЕТ --> Выполнение тела скрипта') = 6 Then
    _FileDirInstall(@ScriptDir & '\123', @TempDir & '\123', 0, '*', 1, 'DirInstall')
    Exit
EndIf


Это вместо параметра запуска.
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
Функция не нашла файлы в исходной папке.
Да, прошу прощения, видимо вчера под утро у меня мозг совсем отказал. сейчас выдает такое

>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\123\Script.au3" /DirInstall
"D:\123\Script.au3" (297) : ==> Error in expression.:
Local $aMacros =
Local $aMacros = ^ ERROR
>Exit code: 1 Time: 3.016
 
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
.upd
скопировал сейчас по новому скрипт и вроде заработало
Сообщение автоматически объединено:


CreatoR, а если папок несколько, то достаточно будет просто добавить? например

AutoIt код:
If $CmdLine[0] And $CmdLine[1] = '/DirInstall' Then
    _FileDirInstall(@ScriptDir & '\123', @ScriptDir & '\123', 0, '*', 1, 'DirInstall')
    _FileDirInstall(@ScriptDir & '\456', @ScriptDir & '\456', 0, '*', 1, 'DirInstall')
    _FileDirInstall(@ScriptDir & '\789', @ScriptDir & '\789', 0, '*', 1, 'DirInstall')
    Exit
EndIf
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
а если папок несколько, то достаточно будет просто добавить? например
Да, но с условием что в качестве последнего параметра ('DirInstall') нужно указывать разные названия, иначе в файле вложений будет содержимое только последней папки (789).
Ну или просто указать там -1, тогда имя будет соответствовать названию исходной папки:
Код:
If $CmdLine[0] And $CmdLine[1] = '/DirInstall' Then
    _FileDirInstall(@ScriptDir & '\123', @ScriptDir & '\123', 0, '*', 1, -1)
    _FileDirInstall(@ScriptDir & '\456', @ScriptDir & '\456', 0, '*', 1, -1)
    _FileDirInstall(@ScriptDir & '\789', @ScriptDir & '\789', 0, '*', 1, -1)
    Exit
EndIf


Не работает однако, разбираюсь в чём дело...
Вроде работает...
 
Последнее редактирование:
Автор
S

sas2242

Новичок
Сообщения
38
Репутация
0
Вроде работает...
да, вроде работает. Скажите, а нельзя сделать так, чтобы при добавлении файлов и папок в .exe и соответственно при их распаковке при выполнении .exe, они имели одну структуру? то есть сейчас все файлы из допустим 123 копируются в папку 123, а я бы хотел, чтобы сохранялись пути, то есть если в папке 123 лежит еще одна папка 456 а в ней 789, то чтобы так это и добавлялось в .exe и при выполнении, чтобы распаковывалось с теми же путями. А так получается, что все фалы из 123 он сваливает в одну папку не учитывая и не создавая подпапок которые там были. (
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
сделать так, чтобы при добавлении файлов и папок в .exe и соответственно при их распаковке при выполнении .exe, они имели одну структуру?
Именно это я и хотел добиться изначально...

Переделал немного концепцию, теперь для получения списка файлов и папок используется _FileListToArrayRec.
Также показан пример удаления папки с файлами после обработки:

Код:
#include <File.au3>

OnAutoItExitRegister('_OnExit')

Global $sDest = @ScriptDir & '\MyFiles'

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()
    Run(@ComSpec & ' /C RD /S /Q "' & $sDest & '"', '', @SW_HIDE)
EndFunc

Func _FileDirInstall($sSrc, $sDest, $iFlag = 0, $sMask = '*', $iSubDirs = 0, $sIncludeName = -1)
    Local $aList, $sDirs, $sData, $sAttrib, $sAttribs, $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)
    $sDirs &= 'DirCreate(' & $sDest & ')' & @CRLF
    $sAttribs &= 'FileSetAttrib(' & $sDest & ', "' & StringReplace(FileGetAttrib($sSrc), 'D', '') & '")' & @CRLF
    
    For $i = 1 To $aList[0]
        $sAttrib = FileGetAttrib($sSrc & '\' & $aList[$i])
        $sAttribs &= 'FileSetAttrib(' & $sDest & ' & "\' & $aList[$i] & '", "' & StringReplace($sAttrib, 'D', '') & '")' & @CRLF
        
        If StringInStr($sAttrib, 'D') Then
            If Not StringInStr($sDirs, 'DirCreate(' & $sDest & ' & "\' & $aList[$i] & '")' & @CRLF) Then
                $sDirs &= 'DirCreate(' & $sDest & ' & "\' & $aList[$i] & '")' & @CRLF
            EndIf
            
            ContinueLoop
        EndIf
        
        $sData &= 'FileInstall("' & $sSrc & '\' & $aList[$i] & '", ' & $sDest & ' & "\' & $aList[$i] & '", ' & $iFlag & ')' & @CRLF
    Next
    
    $sData = $sDirs & $sData & $sAttribs
    
    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
 
Последнее редактирование:
Верх