2011-08-10 8 views
2

もう一つの初心者のNSIS質問があります。私のNSISスクリプトのUninstallはProgramDataディレクトリからのリンクを削除していません

; -*-nsis-*-  
Name "ndhtest" 
OutFile "FooStartMenuTest.exe"  
XPStyle on 
!define FOO_SRC c:\users\nhughes\foo 

InstallDir "$PROGRAMFILES\Initech\" 
Icon ${FOO_SRC}\foo_logo.ico 
UninstallIcon ${FOO_SRC}\uninstall.ico 

Page instfiles 
UninstPage uninstConfirm 
UninstPage instfiles 

Section 
    SetOutPath $INSTDIR 
    File ${FOO_SRC}\foo.bat 
    WriteUninstaller "$INSTDIR\uninstall.exe" 
    CreateDirectory $SMPROGRAMS\Initech 
    CreateShortCut $SMPROGRAMS\Initech\Foo.lnk $INSTDIR\foo.bat "" \ 
    "${FOO_SRC}\foo_logo.ico" 
    CreateShortCut $SMPROGRAMS\Initech\Uninstall.lnk $INSTDIR\uninstall.exe "" \ 
    "${FOO_SRC}\uninstall.ico" 
SectionEnd 

Section "Uninstall" 
    Delete $SMPROGRAMS\Initech\Foo.lnk 
    Delete $SMPROGRAMS\Initech\Uninstall.lnk 
    RMDir $SMPROGRAMS\Initech 
    Delete $INSTDIR\Foo.bat 
    Delete $INSTDIR\uninstall.exe 
    RMDir $INSTDIR 
SectionEnd 

アンインストールがはProgramDataの下にショートカットを残す以外に動作するようです::ここにスクリプトがあります

Directory of c:\ProgramData\Microsoft\Windows\Start Menu\Programs\Initech 

08/10/2011 04:07 PM <DIR>   . 
08/10/2011 04:07 PM <DIR>   .. 
08/10/2011 04:23 PM    1,847 Foo.lnk 
08/10/2011 04:23 PM    1,885 Uninstall.lnk 
       2 File(s)   3,732 bytes 
       2 Dir(s) 1,387,345,117,184 bytes free 

は私のスクリプトが間違って何を取得していることがうろついこのようなものを残していますか?ここで

は(私は$ SMPROGRAMSをリストDetailPrintメッセージを追加しました)アンインストーラがそのコンソールへの書き込みを行うものです:

smprograms=C:\Users\nhughes\AppData\Roaming\Microsoft\Windows\Start Menu\Programs 
Remove folder: C:\Users\nhughes\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Initech\ 
Delete file: C:\Program Files (x86)\Initech\foo.bat 
Delete file: C:\Program Files (x86)\Initech\uninstall.exe 
Remove folder: C:\Program Files (x86)\Initech\ 
Completed 

そうはProgramDataの下にあるリンクを参照しない飽きない、それはのAppData \ローミング下のリンクを探しています代わりに。

私はこれをWindows 7でテストしていますが、ここでの中核的な問題は、Windowsリスルの方法のすべての変更にかかわらず、XPからWindows 7までのすべてに対応するスクリプトを作成できるようにすることです異なるバージョンの異なる場所でそれは痛いかもしれないように見えています。スペックから

+0

これはどのOSで起こっていますか? XP? Vista? Windows 7? – Femi

+0

Windows 7の場合 –

答えて

2

、それはNSISがC:\Users下のファイルを作成しようとしますが、彼らが実際にc:\ProgramDataで作成されていることが明らかになり始めます。このProgramDataディレクトリはdir C:\で表示されないので奇妙なことですが、cdというディレクトリを入力することは可能です。このような謎は、仮想ストアによって引き起こされます。

解決策になりました。 Windowsアプリケーションは実行レベルを定義する必要があります。そうしないと、システムが予期しない動作をする可能性があります。一部のアプリケーションでは、「現在のユーザーのみ」または「すべてのユーザーのために」をインストールするかどうか尋ねられます。それが私たちが宣言する必要があることです。

nsis命令RequestExecutionLevel userを挿入すると、現在のユーザーに対してショートカットが作成されます。 RequestExecutionLevel adminの場合は、インストールセクションとアンインストールセクションの両方にSetShellVarContext allを追加する必要があります。

この回答はnsis wiki:Shortcuts removal fails on Windows Vistaの記事に基づいています。ここでは例を両方の方法で示しています。

0

4.9.1.8 RMDir 

[/r] [/REBOOTOK] directory_name 

Remove the specified directory (fully qualified path with no wildcards). Without /r, the directory will only be removed if it is completely empty. If /r is specified, the directory will be removed recursively, so all directories and files in the specified directory will be removed. If /REBOOTOK is specified, any file or directory which could not have been removed during the process will be removed on reboot -- if any file or directory will be removed on a reboot, the reboot flag will be set. The error flag is set if any file or directory cannot be removed. 

は内容をフラッシュすることを強制するには、rmdirラインに/rを追加してみてください。リンクを個別に削除するか、削除してください。 DetailPrintはNSISスクリプトに追加されている場合は

+0

彼は作成したすべてのファイルを削除するため、/ rスイッチは必要ありません。問題は、ディレクトリがマップされ、ショートカットが別の場所に作成されることです。 'RMDir/r'を使うときは十分注意してください。それは非常によく考えられ、無謀に適用されるべきではありません。 – Jarekczek

関連する問題