2009-01-28 13 views

回答

3

使用外部工具並不總是一個好主意(不適用於Windows的家庭版每一個命令行工具存在),它總是不如直接與系統中的插件調用正確的API。

​​

但在這種情況下,你不應該檢查文件系統類型,但你應該尋找你需要的實際功能(壓縮,加密,路口,稀疏文件等)

!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} 
1

我對NSIS並不熟悉,但您可能會發現這個小小的「DOS」技巧很有用。

我也注意到,有可能打開與NSIS文件,所以這可能會幫助 -

chkntfs c: | find "file system" > yourfile.abc 

CHKNTFS是用於管理CHKDSK操作的工具,但如果你運行的命令,沒有命令線路交換機,它只是報告結果。

的「C:」是你感興趣的驅動器 -

您可以從命令提示符下運行此看到的結果,沒有「> yourfile.abc」 部分的當然,這是什麼將輸出導入該文件。

之前任何人失望票這一點,我只是提供它作爲一個發人深省的建議,或許引發真正的解決方案,並記住SO座右銘 - 善待......哈哈......

編輯:這個片段可以幫助 - 我無法真正測試這個 - 這是編譯時間使用 - 而且你很可能想要運行時間...但是,它可能會給你一個想法...

我「假設」沒有一個已經命名爲NTFS的定義 - 如果是的話,相應地改變它。第一次調用CREATE包含文件,第二個APPENDS(包含double>)... FIND的/ C選項只需計算包含搜索項目的數字行。因此,0或1的結果。

!system 'echo "!define NTFS=" > newinclude.nsh' 
!system 'chkntfs c: | find /c "NTFS" >> newinclude.nsh' 
!include newinclude.nsh 
!ifdef NTFS 
    !echo "NTFS is defined and value should reflect accordingly; 0=NO, 1=Yes it is NTFS" 
!endif 

編輯:(再次笑)

這裏將設置環境變量,從我可以告訴,應該是比較容易在運行時讀取一個片段 - 你可以構造一個變量來執行,相應地替換驅動器號。現在

ExecWait 'chkntfs c: | find /c "NTFS" > tempfile.abc' 
ExecWait 'set /p NTFS= < tempfile.abc' 
Exec  'del tempfile.abc' 

,稱爲NTFS的環境變量應持有0如果不NTFS和1,如果被檢查的體積是NTFS。

或者直接

ExecWait 'chkntfs c: | find /c "NTFS"' $0 

$ 0時返回的代碼;由於這是ERROR返回碼,所以結果是倒退的。如果你有NTFS,那麼> 0表示沒有NTFS。

+0

好建議!如果我找不到更直接的解決方案,我會研究這一點。謝謝! – 2009-01-28 19:50:10

+0

在你的問題之前,我還沒有聽說過這個應用程序,因此,下載了它 - 這是相當了不起的,所以謝謝你提出這個問題。 :) - 如果我碰到任何東西,我會發布它... – Borzio 2009-01-28 19:57:20

1

您的測試需要在運行時進行,因此Borzio's答案本身不起作用。

它也看起來像ExecWait命令不允許重定向,所以它不會工作以這種方式執行它,然後檢查文件的內容。

它看起來對我來說,你最好選挑中的一種:

  • 做出將根據結果
  • 寫一個C運行CHKNTFS然後設置錯誤級別的批處理文件/的C++/VB /等。應用程序將運行chkntfs,然後根據結果設置錯誤級別
  • 編寫一個C/C++/VB/etc。應用程序將使用的Win32 API來確定文件系統
  • 寫NSIS一個插件,它會使用的Win32 API來確定文件系統

編輯: Borzio更新了他之前,我完成了我的:)

您可能需要添加一些東西,我發現在Winamp的論壇:ExecWait with file redirection

ExpandEnvStrings $1 %COMSPEC% 
    ExecWait '"$1" /C chkntfs c: | find /c "NTFS"' $0 

沒有ExpandEnvStrings $1 %COMSPEC%,它不工作我的系統上生成重定向的文件。

我已經測試了上述內容,它確實工作,0爲NTFS和1爲非NTFS。

此方法唯一可能的缺點是在代碼執行期間命令窗口會短暫彈出。

+0

好,你有機會測試它 - 環境問題是未知...... :) – Borzio 2009-01-28 22:18:15