NTFS ボリュームで実行する必要があるプログラム用に、NSIS を使用してインストーラーを作成しています。インストール先のパスが NTFS ボリューム上にあるかどうかを検出し、それに応じて対処するにはどうすればよいですか (ヘルプ/警告メッセージを表示します)?
3 に答える
外部ツールを使用することは常に良い考えではありません (Windows のホーム バージョンにすべてのコマンド ライン ツールが存在するわけではありません)。システム プラグインを使用して正しい API を直接呼び出すことを常にお勧めします。
!include LogicLib.nsh
StrCpy $0 "c:\"
System::Call 'Kernel32::GetVolumeInformation(t "$0",t,i ${NSIS_MAX_STRLEN},*i,*i,*i,t.r1,i ${NSIS_MAX_STRLEN})i.r0'
${If} $0 <> 0
MessageBox mb_ok "fs=$1"
${EndIf}
ただし、この場合、ファイル システムの種類を確認するのではなく、実際に必要な機能 (圧縮、暗号化、ジャンクション、スパース ファイルなど) を探す必要があります。
!define FILE_SUPPORTS_ENCRYPTION 0x00020000
!define FILE_READ_ONLY_VOLUME 0x00080000
!define FILE_VOLUME_QUOTAS 0x00000020
!macro MakeBitFlagYesNo flags bit outvar
IntOp ${outvar} ${flags} & ${bit}
${IfThen} ${outvar} <> 0 ${|} StrCpy ${outvar} "Yes" ${|}
${IfThen} ${outvar} == 0 ${|} StrCpy ${outvar} "No" ${|}
!macroend
StrCpy $0 "c:\"
System::Call 'Kernel32::GetVolumeInformation(t "$0",t,i ${NSIS_MAX_STRLEN},*i,*i,*i.r1,t,i ${NSIS_MAX_STRLEN})i.r0'
${If} $0 <> 0
!insertmacro MakeBitFlagYesNo $1 ${FILE_SUPPORTS_ENCRYPTION} $2
!insertmacro MakeBitFlagYesNo $1 ${FILE_READ_ONLY_VOLUME} $3
!insertmacro MakeBitFlagYesNo $1 ${FILE_VOLUME_QUOTAS} $4
MessageBox mb_ok "flags=$1 $\nFILE_SUPPORTS_ENCRYPTION=$2$\nFILE_READ_ONLY_VOLUME=$3$\nFILE_VOLUME_QUOTAS=$4"
${EndIf}
テストは実行時に行う必要があるため、Borzio の答えは単独では機能しません。
また、ExecWait コマンドではリダイレクトが許可されていないように見えるため、そのように実行してからファイルの内容を確認することはできません。
あなたの最良の選択肢は、次のいずれかを選択することです。
- chkntfs を実行するバッチ ファイルを作成し、結果に基づいてエラー レベルを設定します。
- C/C++/VB/etc を書きます。chkntfs を実行し、結果に基づいてエラー レベルを設定するアプリ
- C/C++/VB/etc を書きます。ファイルシステムを決定するために Win32 API を使用するアプリ
- Win32 API を使用してファイルシステムを判別する NSIS 用のプラグインを作成する
編集:私が私のものを完成させる前に、ボルジオは彼を更新しました:)
Winamp フォーラムで見つけたものを追加する必要があるかもしれません: ExecWait with file redirection
ExpandEnvStrings $1 %COMSPEC%
ExecWait '"$1" /C chkntfs c: | find /c "NTFS"' $0
がないExpandEnvStrings $1 %COMSPEC%
と、システムでリダイレクトされたファイルを生成することができませんでした。
上記をテストしましたが、NTFS の場合は 0、非 NTFS の場合は 1 で動作します。
この方法の唯一の欠点は、コードの実行中にコマンド ウィンドウが短時間ポップアップすることです。