Что нового

Прочитать путь из строки

Сообщения
95
Репутация
-1
Доброе время суток. Нужно получить конечную папку после последнего слеша из текста строки InstallDir
Пример сказал(а):
InstallDir "$PROGRAMFILES\123\<конечная папка>"
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
$Str = 'InstallDir "$PROGRAMFILES\123\<конечная папка>"'
$Dir = StringRegExp($Str, '[^\\"]+', 3)
If Not @error Then ConsoleWrite($Dir[UBound($Dir) - 1] & @CRLF)

;~ #include <Array.au3>
;~ _ArrayDisplay($Dir)
 
Автор
Xabib2302
Сообщения
95
Репутация
-1
Можно найти строку InstallDir в текстовом файле, получить конечную папку и записать в ini?
 
Последнее редактирование:

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Можно найти строку InstallDir в текстовом файле, получить конечную папку и записать в ini?
Как-то так:
Код:
$hFile = @ScriptDir & '\test install.txt'  ; файл где ищет папку установки
$sPath_ini = @ScriptDir & "\Example.ini"  ; файл настроек для записи. Он создастья автоматом, если не был создан



; Проверяет, является ли файл открытым, перед тем как использовать функции чтения/записи в файл
If $hFile = -1 Then
    MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
    Exit
 EndIf

Local $aRecords
If Not _FileReadToArray($hFile, $aRecords) Then
    MsgBox(4096, "Ошибка", " Ошибка чтения файла в массив     Ошибка = " & @error)
    Exit
EndIf
For $i = 1 To $aRecords[0]
   $Str = $aRecords[$i]
   $Dir = StringRegExp($Str, '[^\\"]+', 3)
   If Not @error Then
      ConsoleWrite($Dir[UBound($Dir) - 1] & @CRLF)
      ; Записывает значение переменной $Dir в параметр 'Key' равный 'Dir' & $i (нумерованный список директорий для установки) в секцию 'Путь для установки'.
      IniWrite($sPath_ini, "Путь для установки", 'Dir' & $i, $Dir[UBound($Dir) - 1])
   EndIf
 Next
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Вот же она:
Код:
$Str = $aRecords[$i]
   $Dir = StringRegExp($Str, '[^\\"]+', 3)

Только как я понимаю, вы имели ввиду не маску, а строку для поиска и потом паттерн (маску) которую нужно искать. В примере у Inni $Str - это строка, в которой ищут совпадение.
Там полностью готовый пример. Создайте тестовый файл с текстом, и вставьте в него не меньше одного установочного пути, напр, так:
Код:
sa;dfh ig irg InstallDir "$PROGRAMFILES\123576\gjcktlyzz папка"
InstallDir "$PROGRAMFILES\123\<конечная папка>"
InstallDir "$PROGRAMFILES\новая прога\папка новой проги"
InstallDir "$PROGRAMFILES\новая прога"
"$PROGRAMFILES\самая новая прога"
 
Последнее редактирование:
Автор
Xabib2302
Сообщения
95
Репутация
-1
Я взял на примере nsis скрипт от одной игры. Вот ваш скрипт
Код:
#include <Array.au3>
#include <File.au3>

$hFile = @ScriptDir & '\[NSIS].nsi'  ; файл где ищет папку установки
$sPath_ini = @ScriptDir & "\Example.ini"  ; файл настроек для записи. Он создастья автоматом, если не был создан



; Проверяет, является ли файл открытым, перед тем как использовать функции чтения/записи в файл
If $hFile = -1 Then
    MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
    Exit
 EndIf

Local $aRecords
If Not _FileReadToArray($hFile, $aRecords) Then
    MsgBox(4096, "Ошибка", " Ошибка чтения файла в массив     Ошибка = " & @error)
    Exit
EndIf
For $i = 1 To $aRecords[0]
   $Str = $aRecords[$i]
   $Dir = StringRegExp($Str, '[^\\"]+', 3)
   If Not @error Then
      ConsoleWrite($Dir[UBound($Dir) - 1] & @CRLF)
      ; Записывает значение переменной $Dir в параметр 'Key' равный 'Dir' & $i (нумерованный список директорий для установки) в секцию 'Путь для установки'.
      IniWrite($sPath_ini, "Путь для установки", 'Dir' & $i, $Dir[UBound($Dir) - 1])
   EndIf
 Next

И после поиска получается фигня. Скрипт просто тупо копирует все сроки и nsis скрипта в ini файл
 

Вложения

  • Результат.zip
    45.3 КБ · Просмотры: 1

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
И после поиска получается фигня. Скрипт просто тупо копирует все сроки и nsis скрипта в ini файл
Во-первых, он не все строки копирует )))
И тут нужна скорее всего другая регулярка
Вам нужно найти вот эту строку? StrCpy $INSTDIR "$PROGRAMFILES\$_27_\7 Врат. Путь к Замолксису"
 
Автор
Xabib2302
Сообщения
95
Репутация
-1
Есть такая строка InstallDir "$PROGRAMFILES\Alawar\7 Врат. Путь к Замолксису"
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Есть такая строка InstallDir "$PROGRAMFILES\Alawar\7 Врат. Путь к Замолксису"
Не заметил. Нужна именно она или какие-то вариации?
Дело в том, что в вашем файле куча слэшей в самых разных вариациях. К тому же там часто в конце строки нижнее подчеркивание очень часто, что воспринимается как перенос строки. Потому и результат такой
 
Автор
Xabib2302
Сообщения
95
Репутация
-1
Как вариант можно брать название из строки Name в самом верху
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Как вариант можно брать название из строки Name в самом верху
Патерн (маску) для поиска можно поменять. Оставил переменной, у которой можете поменять на свой вариант
Код:
#include <File.au3>
#include <Array.au3>

Local $rowDataPath[0] ; массив с найденными путями

;$pFile = @ScriptDir & '\test install.txt'  ; файл где ищет папку установки ну или как указано ниже [NSIS].nsi
$pFile = @ScriptDir & '\[NSIS].nsi'
$sPath_ini = @ScriptDir & "\Example.ini"  ; файл настроек для записи. Он создастья автоматом, если не был создан
Local $MaskName = 'InstallDir "$PROGRAMFILES\Alawar\'

$hFile = FileOpen($pFile, 0)

; Проверяет, является ли файл открытым, перед тем как использовать функции чтения/записи в файл
If $hFile = -1 Then
    MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
    Exit
 EndIf

While 1
    $sLine = FileReadLine($hFile)
    If @error = -1 Then ExitLoop

 If StringInStr($sLine, $MaskName) = True Then
_ArrayAdd($rowDataPath, $sLine)
EndIf
WEnd

;_ArrayDisplay($rowDataPath)

For $i = 0 To UBound($rowDataPath)-1
   $Str = $rowDataPath[$i]
   $Dir = StringRegExp($Str, '[^\\"]+', 3)
   If Not @error Then
      ConsoleWrite($Dir[UBound($Dir) - 1] & @CRLF)
      ; Записывает значение переменной $Dir в параметр 'Key' равный 'Dir' & $i (нумерованный список директорий для установки) в секцию 'Путь для установки'.
      IniWrite($sPath_ini, "Путь для установки", 'Dir' & $i, $Dir[UBound($Dir) - 1])
   EndIf
 Next

FileClose($hFile)
 
Верх