2016-09-10 4 views
0

J'ai de la difficulté à utiliser la commande CopyFiles et la valeur que j'ai lue dans le registre UninstallString. La valeur de UninstallString est "C:\myapp\uninstall.exe" (avec des guillemets).NSIS Pourquoi CopyFiles fonctionne-t-il dans un exemple et pas dans l'autre?

Si j'essaie ce qui suit, cela ne fonctionne pas.

CopyFiles $uninstallPath "C:\Temp" # Does not work 

Ensuite, je modifier le Registre et supprimer les citations de la valeur de UninstallString il est donc C:\myapp\uninstall.exe.

Les travaux suivants, mais il n'est pas entouré par des guillemets.

CopyFiles $uninstallPath "C:\Temp" # Works 

Maintenant j'ajoute des guillemets autour de la variable et cela fonctionne. J'ai l'impression que le premier et le dernier exemple sont deux manières différentes de faire la même chose. Toute clarté sur pourquoi le premier exemple ne fonctionne pas?

Répondre

1

Vous comparez des pommes à des oranges, ou dans votre cas, des citations ou des citations dénudées.

Les citations les plus externes sur les paramètres de votre .nsi sont éliminés par le compilateur afin

StrCpy $0 "Hello World" 
MessageBox mb_ok $0 

est exactement le même que

StrCpy $0 "Hello World" 
MessageBox mb_ok "$0" 

Cependant, si vous lisez une chaîne en une variable sur la machine de l'utilisateur puis sans guillemets sont supprimés:

StrCpy $0 '"Hello World"' ; Pretending that we read "Hello World" (with quotes) from somewhere 
MessageBox mb_ok $0 

Il y a un fil avec un tas de dif solutions effectives sur le NSIS forum. Voici mon avis sur ce type de fonction:

!define PathUnquoteSpaces '!insertmacro PathUnquoteSpaces ' 
Function PathUnquoteSpaces 
Exch $0 
Push $1 
StrCpy $1 $0 1 
StrCmp $1 '"' 0 ret 
StrCpy $1 $0 "" -1 
StrCmp $1 '"' 0 ret 
StrCpy $0 $0 -1 1 
ret: 
Pop $1 
Exch $0 
FunctionEnd 
!macro PathUnquoteSpaces var 
Push ${var} 
Call PathUnquoteSpaces 
Pop ${var} 
!macroend 


Section 
!macro Test path 
StrCpy $0 '${Path}' 
StrCpy $1 $0 
${PathUnquoteSpaces} $0 
DetailPrint |$1|->|$0| 
!macroend 
!insertmacro Test 'c:\foo' 
!insertmacro Test 'c:\foo bar' 
!insertmacro Test '"c:\foo"' 
!insertmacro Test '"c:\foo bar"' 
SectionEnd 

Votre code devrait alors ressembler à ceci après avoir copié ma fonction dans votre .nsi:

ReadRegStr $uninstallPath HKLM "Sofware\...\YourAppUninstKey" "UninstallString" 
${PathUnquoteSpaces} $uninstallPath 
CopyFiles $uninstallPath "C:\Temp" 
+0

-vous pas besoin de craindre que vous » re passer l'argument $ uninstallPath à CopyFiles qui peut contenir un espace, mais n'est pas entouré de guillemets? En outre, si les guillemets ne sont pas nécessaires, pourquoi est-il courant d'entourer les chemins stockés dans les registres, puis de les supprimer? – user870130

+1

Vous n'avez pas besoin de citer des variables, même si elles contiennent des espaces, elles sont développées sur la machine de l'utilisateur final longtemps après que le compilateur a analysé tous les paramètres que vous avez passés à une fonction dans votre script. Toute commande qui peut être exécutée doit être citée lorsqu'elle est stockée dans le registre tandis que les autres chemins comme les icônes et les autres fichiers ne sont généralement pas cités. Voir aussi: https://blogs.msdn.microsoft.com/oldnewthing/20070515-00/?p=26863 – Anders

+0

J'ai remarqué un problème mineur avec le code. Le premier StrCpy devrait être StrCpy $ 1 $ 0 1. – user870130