我使用NSIS爲需要在NTFS捲上運行的程序創建安裝程序。如何檢測安裝路徑是否位於NTFS捲上並進行相應操作(顯示幫助/警告消息)?使用NSIS檢測目標卷是否爲NTFS
回答
使用外部工具並不總是一個好主意(不適用於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}
我對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。
您的測試需要在運行時進行,因此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。
此方法唯一可能的缺點是在代碼執行期間命令窗口會短暫彈出。
好,你有機會測試它 - 環境問題是未知...... :) – Borzio 2009-01-28 22:18:15
- 1. NSIS檢查是否存在空目錄
- 2. 如何檢測鼠標是否爲真?
- 3. 檢測iframe是否爲空或目標卸載能力
- 4. 檢查NSURLRequest目標是否爲「_blank」?
- 5. 確定NTFS卷是否安裝在外部
- 6. NSIS:檢測是否安裝了VS2005運行時
- 7. NSIS安裝程序:檢測是否RequestExecutionLevel沒有工作
- 8. 檢測程序是否已經與NSIS一起安裝
- 9. GIO:檢查是否卷裝
- 10. 檢測RichTextBox是否爲空
- 11. 檢測TrueCrypt卷
- 12. NSIS:檢測Tomcat安裝
- 13. NSIS檢測Windows版本
- 14. NSIS 3.0b1是否適合生產使用?
- 15. 爲什麼我的MacFUSE NTFS卷是隻讀的?
- 16. NTFS-Search(一個OSS項目)可以掃描NTFS捲上的任何文件嗎?
- 17. 使用Kinect V2進行目標檢測
- 18. 使用python進行目標檢測,scipy
- 19. 使用HammerJS檢測拖放目標
- 20. 如何檢測USB驅動器是NTFS還是FAT32 in objective-c
- 21. 如何檢查項目是否爲測試項目? (NUnit,MSTest,xUnit)
- 22. 如何檢測Blobstore條目是否爲get_serving_url可用的圖像?
- 23. 檢測Facebook用戶是否使用HTTPS
- 24. .NET FileSystemWatcher的檢測NTFS安全更改
- 25. 使用NSIS檢查.NET4.5 +
- 26. 目標C - 檢測
- 27. 檢測出目錄是否在Delphi
- 28. 目錄檢測當前是否打開
- 29. qtreeview測試是否可檢查項目
- 30. 檢測條目是否存在錨點
好建議!如果我找不到更直接的解決方案,我會研究這一點。謝謝! – 2009-01-28 19:50:10
在你的問題之前,我還沒有聽說過這個應用程序,因此,下載了它 - 這是相當了不起的,所以謝謝你提出這個問題。 :) - 如果我碰到任何東西,我會發布它... – Borzio 2009-01-28 19:57:20