我正在尝试将我的代码从Inno Setup 5转换为6。我无法使以下代码正常工作。
我以前的工作代码是:
procedure CurStepChanged(CurStep: TSetupStep);
var
FileData: String;
begin
if (CurStep = ssInstall) then
begin
LoadStringFromFile(ExpandConstant('{code:GetSvcDir|2}\PostSteps.ps1'), FileData);
StringChange(FileData, 'ScvProdPath', ExpandConstant('{code:GetSvcDir|0}\'));
StringChange(FileData, 'ProdSitePath', ExpandConstant('{code:GetWebDir|0}\'));
StringChange(FileData, 'ProdAuthPath', ExpandConstant('{code:GetWebDir|1}\'));
StringChange(FileData, '444', ExpandConstant('{code:GetConfig|4}'));
StringChange(FileData, '8732', ExpandConstant('{code:GetConfig|3}'));
StringChange(FileData, 'RV_ExceptionsPath', ExpandConstant('{code:GetSvcDir|2}\RVExceptions'));
SaveStringToFile(ExpandConstant('{code:GetSvcDir|2}\PostSteps.ps1'), FileData, False);
end;
end;
在阅读了类似这样的文章后,我试图对其进行更改,但是我无法使其正常工作。
procedure CurStepChanged(CurStep: TSetupStep);
var
FileData: AnsiString;
UnicodeStr: string;
begin
if (CurStep = ssInstall) then
begin
LoadStringFromFile(ExpandConstant('{code:GetSvcDir|2}\PostSteps.ps1'), FileData);
StringChangeEx(UnicodeStr, 'ScvProdPath', ExpandConstant('{code:GetSvcDir|0}\'), True);
StringChangeEx(UnicodeStr, 'ProdSitePath', ExpandConstant('{code:GetWebDir|0}\'), True);
StringChangeEx(UnicodeStr, 'ProdAuthPath', ExpandConstant('{code:GetWebDir|1}\'), True);
StringChangeEx(UnicodeStr, '444', ExpandConstant('{code:GetConfig|4}'), True);
StringChangeEx(UnicodeStr, '8732', ExpandConstant('{code:GetConfig|3}'), True);
StringChangeEx(UnicodeStr, 'RV_ExceptionsPath', ExpandConstant('{code:GetSvcDir|2}\RVExceptions'), True);
SaveStringToFile(ExpandConstant('{code:GetSvcDir|2}\PostSteps.ps1'), FileData, False);
end;
end;
文件中的文本为英语,不是特别的东西。你能帮我吗?
答案 0 :(得分:1)
正如我对您之前的问题所做的评论,这与从Inno Setup 5升级到Inno Setup 6无关。InnoSetup 6与Inno Setup 5代码兼容。您的问题是您使用了Inno Setup 5的旧版Ansi版本。InnoSetup 6仅具有Unicode版本。即使使用Inno Setup 5,您也应该使用Unicode版本。 参见Upgrading from Ansi to Unicode version of Inno Setup (any disadvantages)
通常,您不应使用AnsiString
。这是Ansi版本的遗产。使用AnsiString
,如果用户在路径中使用非ASCII字符,则代码将失败。
最后,您的问题或多或少重复了以下内容:
Inno Setup replace a string in a UTF-8 file without BOM
无论如何,要回答您的字面问题:您永远不会分配UnicodeStr
变量。
也和您之前的问题一样:不要使用ExpandConstant
来调用函数。
procedure CurStepChanged(CurStep: TSetupStep);
var
FileData: AnsiString;
UnicodeStr: string;
begin
if (CurStep = ssInstall) then
begin
LoadStringFromFile(GetSvcDir('2') + '\PostSteps.ps1', FileData);
UnicodeStr := FileData;
StringChangeEx(UnicodeStr, 'ScvProdPath', GetSvcDir('0') + '\', True);
StringChangeEx(UnicodeStr, 'ProdSitePath', GetWebDir('0') + '\', True);
StringChangeEx(UnicodeStr, 'ProdAuthPath', GetWebDir('1') + '\', True);
StringChangeEx(UnicodeStr, '444', GetConfig('4'), True);
StringChangeEx(UnicodeStr, '8732', GetConfig('3'), True);
StringChangeEx(UnicodeStr, 'RV_ExceptionsPath', GetSvcDir('2') + '\RVExceptions', True);
FileData := UnicodeStr;
SaveStringToFile(GetSvcDir('2') + '\PostSteps.ps1', FileData, False);
end;
end;
(未经测试)
然后您可能甚至不需要这些功能-您可以将它们内联到上述代码中,除非您在其他地方使用它们。
您还将发现AddBackslash
function有用。