2017-08-23 3 views
0

J'essaie de mettre à jour une chaîne INI qui a quelque chose de similaire à [Version]DisplayVersion=0.0.298 à partir de la recherche d'un nouveau répertoire dans un dossier. La chaîne INI actuelle, 0.0.298, correspond au répertoire en cours qui ressemble à ..\app-0.0.298.Mise à jour de la chaîne INI à l'aide de FindFirst

Pendant l'exécution, l'application se met parfois à jour en créant un nouveau dossier qui pourrait ressembler à ..\app-0.0.301. Ce que je veux faire est de trouver ce répertoire et écrire son nouveau numéro de version à [Version]DisplayVersion pour correspondre à la nouvelle version mise à jour afin qu'il ressemble à ceci: [Version]DisplayVersion=0.0.301.

J'ai ce qui à ce jour ne fonctionne pas:

FindFirst $0 $1 `${APPDIR}\app-*` 
ReadEnvStr $2 BUILD # Set earlier in the script ($2 = 0.0.298) 
StrCmp $1 "" +11 
Push `$2.0` 
Push `$1.0` 
Call VersionCompare # http://nsis.sourceforge.net/VersionCompare 
Pop $3 
IntCmp $3 1 +4 +4 0 
IfFileExists `${APPDIR}\app-$1\${APP}.exe` 0 +3 
DeleteINIStr "${InfoINI}" "Version" "DisplayVersion" 
WriteINIStr "${InfoINI}" "Version" "DisplayVersion" "$1" 
FindNext $0 $1 
Goto -10 
FindClose $0 

Qu'est-ce que je manque ici ou est-il une meilleure façon de faire cela?

+0

Qu'est-ce qui ne fonctionne pas? Énumération d'annuaire? VersionCompare? Ini manutention? Et que sont définis APPDIR et InfoINI? – Anders

Répondre

1

Même si vous transmettez un caractère générique à FindFirst, le nom de fichier renvoyé contiendra toujours le nom complet et vous finirez par comparer 0.0.298.0 à app-0.0.298.0.

Section "-Initialize example" 
!define APP "MyApp" 
!define APPDIR "$temp\Test" 
!define InfoINI "$temp\Test\app.ini" 
CreateDirectory "${APPDIR}\app-0.0.298" 
WriteINIStr "${InfoINI}" "Version" "DisplayVersion" "0.0.298" 
System::Call 'KERNEL32::SetEnvironmentVariable(t "BUILD", t "0.0.298")' 
SectionEnd 

!include LogicLib.nsh 

Page Components 
Page InstFiles 

Section "Emulate a update" 
CreateDirectory "${APPDIR}\app-0.0.301" 
File "/oname=${APPDIR}\app-0.0.301\${APP}.exe" "${__FILE__}" 
SectionEnd 


Section "Test" 
SectionIn RO 
FindFirst $0 $1 `${APPDIR}\app-*` 
ReadEnvStr $2 BUILD # Set earlier in the script ($2 = 0.0.298) 
loop: 
    StrCmp $1 "" done 
    StrCpy $3 $1 4 
    StrCmp $3 "app-" 0 trynext 
    StrCpy $1 $1 "" 4 ; Remove "app-" prefix 
    Push `$2.0` 
    Push `$1.0` 
    Call VersionCompare # http://nsis.sourceforge.net/VersionCompare 
    Pop $3 
    ${If} $3 > 1 
     ${If} ${FileExists} "${APPDIR}\app-$1\${APP}.exe" 
      # DeleteINIStr "${InfoINI}" "Version" "DisplayVersion" ; You don't have to delete before writing 
      WriteINIStr "${InfoINI}" "Version" "DisplayVersion" "$1" 
     ${EndIf} 
    ${EndIf} 
    trynext: 
     FindNext $0 $1 
    Goto loop 
done: 
FindClose $0 
SectionEnd 

Astuce: L'utilisation de sauts relatifs rend le code plus difficile à lire (et modifier), l'utilisation des étiquettes et/ou LogicLib.nsh

+0

J'aurais dû savoir mieux mais si je ne l'ai pas fait, maintenant je le fais. Merci Anders. J'ai habituellement besoin d'un autre ensemble d'yeux quand je ne peux pas voir quelque chose et que tes yeux passent toujours pour moi. –