NSIS FileRead 条件覆盖
NSIS FileRead conditional override
我不是程序员,所以需要你的帮助(请怜悯我)。
我应该需要在现有的 NSIS 脚本中添加一个执行以下操作的函数:
检查名为 169.254.1.1 的值是否存在于名为 myfile.ini 的 INI 文件中并放置在
c:\我的目录
如果它在 myfile.ini 中找到这个值,它不应该做任何其他事情(即让脚本执行后续步骤)。
如果它没有在 myfile.ini 中找到这个值,它应该覆盖文件
与另一个通过从 c:\dummyfile\myfile.ini
中静默复制
然后让脚本执行后续步骤。
我不知道如何告诉 NSIS 这样做,请问您能帮忙吗?
提前感谢您的专业知识。
美莲娜。
如果您的文件是包含 [sections] 的实际 .INI 文件,那么您可以只使用 INI 函数:
Section "Prepare INI example"
InitPluginsDir
WriteIniStr "$PluginsDir\MyFile.ini" ServerInfo ServerAddress "169.254.1.1"
WriteIniStr "$PluginsDir\Dummy.ini" ServerInfo ServerAddress "127.0.0.1"
SectionEnd
!include LogicLib.nsh
Section
ReadIniStr [=10=] "$PluginsDir\MyFile.ini" ServerInfo ServerAddress
ReadIniStr "$PluginsDir\MyFile.ini" ServerInfo ServerAddressBck
${If} [=10=] != "169.254.1.1"
${AndIf} != "169.254.1.1"
CopyFiles /SILENT /FILESONLY "$PluginsDir\Dummy.ini" "$PluginsDir\MyFile.ini"
${EndIf}
SectionEnd
如果您没有真正的 .INI 文件,只有名称=值对的文件,那么您必须手动解析:
Section "Prepare fake INI example"
InitPluginsDir
FileOpen [=11=] "$PluginsDir\MyFile.ini" w
FileWrite [=11=] 'Foo$\r$\n'
FileWrite [=11=] 'Bar$\r$\n'
FileWrite [=11=] 'ServerAddress=169.254.1.1$\r$\n'
FileWrite [=11=] 'Baz$\r$\n'
FileClose [=11=]
WriteIniStr "$PluginsDir\Dummy.ini" ServerInfo ServerAddress "127.0.0.1"
SectionEnd
!include LogicLib.nsh
Function TrimTrailingNewlinesAndSpaces
Exch
Push
again:
StrCpy "" -1
StrCmp " " +3
StrCmp "$\r" +2
StrCmp "$\n" +1 +3
StrCpy -1
Goto again
Pop
Exch
FunctionEnd
Section
StrCpy "" ; Have not found the magic line
ClearErrors
FileOpen [=11=] "$PluginsDir\MyFile.ini" r
loop:
FileRead [=11=]
IfErrors done
Push
Call TrimTrailingNewlinesAndSpaces
Pop
${If} == "ServerAddress=169.254.1.1"
${OrIf} == "ServerAddressBck=169.254.1.1"
StrCpy 1
${Else}
Goto loop
${EndIf}
done:
FileClose [=11=]
${If} = 0
CopyFiles /SILENT /FILESONLY "$PluginsDir\Dummy.ini" "$PluginsDir\MyFile.ini"
${EndIf}
SectionEnd
我不是程序员,所以需要你的帮助(请怜悯我)。 我应该需要在现有的 NSIS 脚本中添加一个执行以下操作的函数:
检查名为 169.254.1.1 的值是否存在于名为 myfile.ini 的 INI 文件中并放置在
c:\我的目录
如果它在 myfile.ini 中找到这个值,它不应该做任何其他事情(即让脚本执行后续步骤)。
如果它没有在 myfile.ini 中找到这个值,它应该覆盖文件
与另一个通过从 c:\dummyfile\myfile.ini
中静默复制然后让脚本执行后续步骤。
我不知道如何告诉 NSIS 这样做,请问您能帮忙吗?
提前感谢您的专业知识。
美莲娜。
如果您的文件是包含 [sections] 的实际 .INI 文件,那么您可以只使用 INI 函数:
Section "Prepare INI example"
InitPluginsDir
WriteIniStr "$PluginsDir\MyFile.ini" ServerInfo ServerAddress "169.254.1.1"
WriteIniStr "$PluginsDir\Dummy.ini" ServerInfo ServerAddress "127.0.0.1"
SectionEnd
!include LogicLib.nsh
Section
ReadIniStr [=10=] "$PluginsDir\MyFile.ini" ServerInfo ServerAddress
ReadIniStr "$PluginsDir\MyFile.ini" ServerInfo ServerAddressBck
${If} [=10=] != "169.254.1.1"
${AndIf} != "169.254.1.1"
CopyFiles /SILENT /FILESONLY "$PluginsDir\Dummy.ini" "$PluginsDir\MyFile.ini"
${EndIf}
SectionEnd
如果您没有真正的 .INI 文件,只有名称=值对的文件,那么您必须手动解析:
Section "Prepare fake INI example"
InitPluginsDir
FileOpen [=11=] "$PluginsDir\MyFile.ini" w
FileWrite [=11=] 'Foo$\r$\n'
FileWrite [=11=] 'Bar$\r$\n'
FileWrite [=11=] 'ServerAddress=169.254.1.1$\r$\n'
FileWrite [=11=] 'Baz$\r$\n'
FileClose [=11=]
WriteIniStr "$PluginsDir\Dummy.ini" ServerInfo ServerAddress "127.0.0.1"
SectionEnd
!include LogicLib.nsh
Function TrimTrailingNewlinesAndSpaces
Exch
Push
again:
StrCpy "" -1
StrCmp " " +3
StrCmp "$\r" +2
StrCmp "$\n" +1 +3
StrCpy -1
Goto again
Pop
Exch
FunctionEnd
Section
StrCpy "" ; Have not found the magic line
ClearErrors
FileOpen [=11=] "$PluginsDir\MyFile.ini" r
loop:
FileRead [=11=]
IfErrors done
Push
Call TrimTrailingNewlinesAndSpaces
Pop
${If} == "ServerAddress=169.254.1.1"
${OrIf} == "ServerAddressBck=169.254.1.1"
StrCpy 1
${Else}
Goto loop
${EndIf}
done:
FileClose [=11=]
${If} = 0
CopyFiles /SILENT /FILESONLY "$PluginsDir\Dummy.ini" "$PluginsDir\MyFile.ini"
${EndIf}
SectionEnd