StrContains函数参数显示变量的错误“无效命令”

时间:2019-04-17 12:33:51

标签: installer nsis

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

根据Wiki(https://nsis.sourceforge.io/StrContains),其参数如下: ${StrContains} "$result_var" "Needle" "Haystack"

例子如下:

${StrContains} $0 "Dirt" "Dirty deeds done dirt cheap"

但是当我尝试使用此功能时,编译器会向我显示错误:

无效的命令:$ ContainsText

我试图将变量更改为堆栈$ 0,但结果相同。 似乎问题出在参数上,但参数重新排序无济于事。将变量包括在引号中也没有任何作用。

我使用NSIS 3.01,然后更新到最新版本3.04-结果相同。

这是我的测试* .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”,但不会编译。

请帮助我了解原因。 预先感谢。

2 个答案:

答案 0 :(得分:0)

安德烈。

看起来您的参数顺序错误。另外,将变量更改为$ 0是正确的。

用法是:

import  re
list_of_lines = ['Senior Cloud Specialist\nFull-time · Singapore · 5 - 10 Years\n12 days ago', 'Cloud Native Developer\nFull-time · Hyderabad · 2 - 5 Years\n13 days ago']

just_replace = [re.sub('\n',",",lines) for lines in list_of_lines]

replace_then_split_to_list_of_lists = [re.sub('\n',",",lines).split(',') for lines in list_of_lines]

replace_and_then_split_to_flat_list = sum([re.sub('\n',",",lines).split(',') for lines in list_of_lines],[])

no_replace_split_flat_list = sum([lines.split('\n') for lines in list_of_lines],[])

其中${StrContains} "$result_var" "Needle" "Haystack" = $ 0,"$result_var" =“ temp”(您正在寻找的针),而"Needle" = $ INSTDIR(您正在寻找的干草堆)。

>

所以,而不是:

"Haystack"

尝试一下:

${StrContains} $ContainsText $INSTDIR "temp"

答案 1 :(得分:0)

我最近有同样的问题。

最初,它是在抛出Invalid command: "$0"。后来我得知一个未定义的${StrContains}引起了此麻烦。

文档还不清楚,我希望在脚本文件中包含/定义一个StrContains类文件,该文件应该可以工作。但是到目前为止,没有一个工作。我看到过很老的讨论,其中!include StrContains.nsh被称为-但这不适用于最新版本的NSIS。

最后对我有用的是从StrContains documentation页添加完整的“功能代码”。我没想到这一点,从文档中也看不出来。但这对我有用,而且我可以在脚本文件中调用${StrContains}的方式。