Installation StrContains函数参数显示错误“;无效命令";对于变量

Installation StrContains函数参数显示错误“;无效命令";对于变量,installation,nsis,Installation,Nsis,我正在尝试使用NSIS StrContains命令。 根据wiki(),其参数如下: ${StrContains}“$result\u var”“Needle”“Haystack” 下面是一个例子: ${StrContains}$0“肮脏”“肮脏的行为做得非常便宜” 但是当我尝试使用这个函数时,编译器向我显示了一个错误: 无效命令:$ContainsText 我试图将变量更改为堆栈$0,但结果是一样的。 问题似乎出在参数上,但参数重新排序没有帮助。将变量包含在引号中也没有任何效果。 我使用了N

我正在尝试使用NSIS StrContains命令。

根据wiki(),其参数如下:
${StrContains}“$result\u var”“Needle”“Haystack”
下面是一个例子:
${StrContains}$0“肮脏”“肮脏的行为做得非常便宜”
但是当我尝试使用这个函数时,编译器向我显示了一个错误: 无效命令:$ContainsText

我试图将变量更改为堆栈$0,但结果是一样的。 问题似乎出在参数上,但参数重新排序没有帮助。将变量包含在引号中也没有任何效果。 我使用了NSIS 3.01,然后更新到最新版本3.04-结果相同

这是我的test*.nsi文件:

;Include Modern UI
  !include "MUI2.nsh"
; Include for String commands
  !include "LogicLib.nsh"
;--------------------------------
;General

  ;Name and file
  Name "Basic Test"
  OutFile "Basic.exe"

  ;Default installation folder
  InstallDir "C:\temp"

  ;Request application privileges
  RequestExecutionLevel user

  ; import functions
  !define StrContains

;--------------------------------
;Interface Settings
  !define MUI_ABORTWARNING
;--------------------------------
;Pages
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
;--------------------------------
;Languages
  !insertmacro MUI_LANGUAGE "English"
;--------------------------------
;Installer Sections

Var ContainsText

Section "Dummy Section" SecDummy

  SetOutPath "$INSTDIR"
  ;set 5 as initial value
  StrCpy $ContainsText "5"
  MessageBox MB_OK "Initial value: $ContainsText"

  ; check if inst dir contains 'temp'
  ; According to https://nsis.sourceforge.io/StrContains
  ; ${StrContains} "$result_var" "Needle" "Haystack"
  ${StrContains} $ContainsText $INSTDIR "temp"
  MessageBox MB_OK "Cmp result: $ContainsText"

  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"

SectionEnd

;--------------------------------
;Uninstaller Section
Section "Uninstall"
  Delete "$INSTDIR\Uninstall.exe"
  RMDir "$INSTDIR"
SectionEnd
我希望第一个参数是一个结果变量,第二个原始字符串,第三个搜索子字符串。 StrContains变量应为“test”,但这不会编译。 请帮助我了解原因。 提前谢谢。

安德烈

看起来你的论点顺序不对。此外,将变量更改为$0也是正确的

用法是:

${StrContains} "$result_var" "Needle" "Haystack"
其中,
“$result\u var”
=$0、
“针”
=“温度”(您正在寻找的针)和
“干草堆”
=$INSTDIR(您正在寻找的干草堆)

因此,不是:

${StrContains} $ContainsText $INSTDIR "temp"
试试这个:

${StrContains} $0 "temp" $INSTDIR

我最近也有同样的问题

最初,它抛出的
命令无效:“$0”
。后来我了解到一个未定义的
${StrContains}
导致了这个问题

文档非常不清楚,我希望在我的脚本文件中包含/定义一个
StrContains
类文件。但到目前为止,没有一个有效。我见过非常古老的讨论,其中
!include StrContains.nsh
已被调用,但这在最新版本的NSIS中不再起作用


最后,对我来说有效的是从StrContains页面添加完整的“函数代码”。我没有预料到这一点,从文档中也看不清楚。但是这对我来说很有效,我能够在脚本文件中调用
${StrContains}
方式。

编译器首先说问题出在$ContainsText变量中。更改参数不会影响编译器,只会影响结果。您必须使用一个
寄存器
变量,如
$0、
等,来代替
$ContainsText
变量`${StrContains}`函数在
寄存器
变量中返回结果。有关详细信息,请参见,4.2.2。您是否能够解决此问题?我面临同样的问题,使用
$0
会抛出
无效命令:“$0”
在哪里添加StrContains函数代码?刚刚在主构建NSIS脚本文件中添加了StrContains方法的完整堆栈。