2016-09-10 5 views
0

CopyFiles 명령과 UninstallString 레지스트리에서 읽은 값을 사용하는 데 문제가 있습니다. UninstallString 값은 "C:\myapp\uninstall.exe" (따옴표 포함)입니다.NSIS 왜 CopyFile은 다른 예가 아닌 한 예에서 작동합니까?

다음을 시도해도 작동하지 않으면. 이 C:\myapp\uninstall.exe 그래서

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

다음, 나는의 UninstallString의 값에서 따옴표를 레지스트리를 편집 및 제거 할 수 있습니다.

다음은 작동하지만 따옴표로 묶지는 않습니다.

CopyFiles $uninstallPath "C:\Temp" # Works 

이제 변수 주위에 따옴표를 추가하고 작동합니다.

CopyFiles "$uninstallPath" "C:\Temp" # Works 

첫 번째 사례와 마지막 사례는 같은 일을하는 두 가지 다른 방식이라고 생각합니다. 첫 번째 예제가 효과가없는 이유에 대한 명확한 설명은 없습니까?

답변

1

당신은 사과를 오렌지 또는 귀하의 경우 따옴표 대 박탈 따옴표와 비교하고 있습니다. 당신의 .nsi의 매개 변수에 대한

가장 바깥 쪽 따옴표는 당신이에 변수에 문자열을 읽으면 너무

StrCpy $0 "Hello World" 
MessageBox mb_ok $0 

은 그러나 정확히

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

과 동일한 컴파일러에 의해 제거된다 사용자가 컴퓨터를 제거하면 따옴표가 제거되지 않습니다.

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

dif foont 솔루션을 NSIS forum에 설치하십시오.

!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 

다음 .nsi으로 제 기능을 복사 한 후 같은 것을 보여야 코드 :

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

하는 것은 필요하지 않은이 걱정하는 그 '다음은 그 함수의 종류에 내 걸릴 것입니다 인수 $ uninstallPath를 공백을 포함 할 수 있지만 따옴표로 묶지 않은 CopyFiles에 전달합니까? 따옴표가 필요하지 않은 경우 레지스트리에 저장된 경로를 둘러싸고 제거하는 것이 일반적인 관례입니까? – user870130

+1

변수에 공백이 있어도 변수를 인용 할 필요는 없으며 컴파일러가 스크립트의 함수에 전달한 매개 변수를 구문 분석 한 후에도 최종 사용자 시스템에서 확장됩니다. 실행될 수있는 명령은 레지스트리에 저장 될 때 인용되어야하며 아이콘이나 다른 파일과 같은 다른 경로는 일반적으로 인용되지 않습니다. 참고 자료 : https://blogs.msdn.microsoft.com/oldnewthing/20070515-00/?p=26863 – Anders

+0

코드에 약간의 문제가 있음을 확인했습니다. 첫 번째 StrCpy는 StrCpy $ 1 $ 0이어야합니다. – user870130