Saya telah mendefinisikan variabel:

#define AppVersion "5.0"

Ada banyak pesan standar dari file Default.isl yang diganti di bagian `[Pesan] skrip saya. Berikut ini contohnya:

[Messages]
en.WelcomeLabel1=Welcome to [name] {#AppVersion} Setup program. This program will install [name] {#AppVersion} on your computer.
en.SelectDirDesc=Where should [name] {#AppVersion} be installed?
en.SelectDirLabel3=Setup will install [name] {#AppVersion} into the following folder.

Saya tidak suka fakta bahwa semua pesan itu berada di skrip saya dan saya ingin mentransfernya ke file .isl yang sesuai. Masalahnya adalah saya tidak dapat menggunakan {#AppVersion} di dalam file .isl karena ditafsirkan sebagai teks sederhana. Apakah ada cara untuk mengganti pesan tersebut di file .isl dengan mempertimbangkan bahwa pesan tersebut mengandung {#AppVersion}?

1
JConstantine 20 November 2020, 18:28

1 menjawab

Jawaban Terbaik

Jika Anda perlu memasukkan beberapa informasi khusus, Anda dapat memproses file .isl seperti ini:

#define Token1 "value1"
#define Token2 "value2"

#define PreprocessLanguage(Path) \
  Local[0] = GetEnv("TEMP") + "\" + ExtractFileName(Path), \
  Local[1] = \
    "-ExecutionPolicy Bypass -Command """ + \
    "$contents = Get-Content '" + CompilerPath + "\" + Path + "'; " + \
    "$contents = $contents -replace '[token1]', '" + Token1 +"'; " + \
    "$contents = $contents -replace '[token2]', '" + Token2 +"'; " + \
    "Set-Content -Path '" + Local[0] + "' -Value $contents;" + \
    """", \
  Exec("powershell.exe", Local[1], , , SW_HIDE), \
  Local[0]

[Languages]
Name: "en"; MessagesFile: {#PreprocessLanguage("Default.isl")}
Name: "nl"; MessagesFile: {#PreprocessLanguage("Languages\Dutch.isl")}

Contoh di atas menggantikan semua kemunculan [token1] dan [token2] dengan nilai variabel praprosesor Token1 dan Token2.


Secara teoritis, dimungkinkan untuk mengimplementasikan ini sepenuhnya di praprosesor tanpa menggunakan PowerShell, dengan menggunakan FileOpen, FileRead, < a href="https://jrsoftware.org/ispphelp/index.php?topic=stringchange" rel="nofollow noreferrer"StringChange, dan SaveStringToFile berfungsi.

#define Token1 "value1"
#define Token2 "value2"

#define PreprocessLanguageLines(Handle, OutPath) \
    !FileEof(Handle) ? \
      Local[0] = FileRead(Handle), \
      Local[0] = StringChange(Local[0], "[token1]", Token1), \
      Local[0] = StringChange(Local[0], "[token1]", Token2), \
      SaveStringToFile(OutPath, Local[0] + NewLine, 1, 0), \
      PreprocessLanguageLines(Handle, OutPath) \
    : ""

#define PreprocessLanguage(Path) \
  Local[0] = GetEnv("TEMP") + "\" + ExtractFileName(Path), \
  SaveStringToFile(Local[0], "", 0, 0), \
  Local[1] = FileOpen(CompilerPath + "\" + Path), \
  PreprocessLanguageLines(Local[1], Local[0]), \
  FileClose(Local[1]), \
  Local[0]

Tetapi dengan pendekatan fungsional langsung, Anda akan mencapai batas rekursi dari praprosesor karena file bahasa memiliki terlalu banyak baris. Itu bisa diselesaikan dengan membaca beberapa baris per rekursi, tapi itu peretasan.

Dengan menggunakan #sub, itu akan berfungsi. Tapi itu berantakan.

1
Martin Prikryl 27 November 2020, 07:48