NSIS获取文件路径的最后一个字符串

时间:2018-06-08 13:00:43

标签: nsis

如何从NSIS语言中的字符串中仅获取jre1.8.0_91?

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

2 个答案:

答案 0 :(得分:1)

@Vinod希望您使用的是最新版本的NSIS。此外,包括NSIS(nsh.zip)的最新版本的标头,或包括WordFind功能

!include "WordFunc.nsh"
<。>在.nsi脚本中。

使用它可以使用WordFind函数从文件路径(在您的示例中为C:\ Program Files \ Java \ jre1.8.0_91)中提取文件名(在您的示例中为jre1.8.0_91),如下所示: / p>

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

$ R0将包含最后一个&#34;字&#34; (jre1.8.0_91)来自文件路径。

这是通过使用反斜杠(&#34; \&#34;)作为字符串的分隔符,并选择第一个单词,从末尾向后计数(&#34; -1&#34;)来实现的。字符串。

答案 1 :(得分:0)

NSIS中的每个字符串操作都可以使用StrCpyStrCmpStrLen进行编码。你可以尝试这样的事情:

!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