NSIS, чтобы получить последнюю строку пути к файлу - PullRequest
0 голосов
/ 08 июня 2018

Как получить только строку jre1.8.0_91 из строки на языке NSIS?

String "C:\Program Files\Java\jre1.8.0_91"

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Каждая строковая операция в NSIS может быть закодирована с StrCpy, StrCmp и StrLen.Вы можете попробовать что-то вроде этого:

!macro PathGetFilename path outvar
Push "${path}"
Call PathGetFilename
Pop ${outvar}
!macroend
Function PathGetFilename
Exch $1
Push $2
Push $3
StrCpy $2 ""
loop:
    IntOp $2 $2 - 1
    StrCpy $0 $1 1 $2
    StrCmp $0 "" done
    StrCmp $0 '\' +3
    StrCmp $0 '/' +2
    Goto loop
    IntOp $2 $2 + 1
    IntCmp $2 0 "" +2 +2
        StrCpy $1 "" ; Ended with slash, return empty string
    StrCpy $1 $1 "" $2
done:
Pop $3
Pop $2
Exch $1
FunctionEnd


Section
!insertmacro PathGetFilename "c:\test" $0
DetailPrint |$0|
!insertmacro PathGetFilename "c:\foo/bar" $0
DetailPrint |$0|
!insertmacro PathGetFilename "nameonly" $0
DetailPrint |$0|
!insertmacro PathGetFilename "\endslash\" $0
DetailPrint |$0|
SectionEnd
0 голосов
/ 08 июня 2018

@ Vinod Надеюсь, вы используете последнюю версию NSIS.Кроме того, включите либо последнюю версию заголовков с NSIS (nsh.zip), либо включите функцию WordFind

!include "WordFunc.nsh"

в ваш скрипт .nsi.

С этим вы можете использовать WordFindФункция для извлечения имени файла (jre1.8.0_91 в вашем примере) из пути к файлу (C: \ Program Files \ Java \ jre1.8.0_91 в вашем примере), например:

 ${WordFind} "${FilePath}" "\" "-1" $R0

$ R0будет содержать последнее «слово» (jre1.8.0_91) из пути к файлу.

Это было достигнуто путем использования обратной косой черты («\») в качестве разделителя строки и выбора первого слова, считаяназад ("-1") от конца строки.

...