如果检测的目标卷NTFS使用NSIS
题
我正在创造一个安装与国家统计局的程序需要运行在windows nt量。怎么做我检测,如果安装路径是在windows nt量,并采取相应行动(显示一个帮助/预警信息)?
解决方案
使用外部工具并不总是一个好主意(不适用于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}
其他提示
我不熟悉的NSIS,但你会发现这个小“DOS”招有用。
我也注意到,有可能打开与NSIS文件,所以这可能会帮助 -
chkntfs c: | find "file system" > yourfile.abc
CHKNTFS是用于管理CHKDSK操作的效用,但是如果使用任何命令行开关的命令时,它简单地报告结果。
在 “C:” 是你感兴趣的驱动器 -
可以从命令提示符运行此看到的结果,而不在“> yourfile.abc” 强> 部分,当然,这是在输出引导到该文件中。的
在任何人失望票这一点,我只是提供它作为一个发人深省的建议,或许引发真正的解决方案,并记住SO座右铭 - 善待......哈哈......
编辑:这个片段可以帮助 - 我有没有办法真正检验这个 - 这是编译时使用 - 你很可能要运行时间......但是,它可能会给你的想法..
我“假设”没有一个定义已命名NTFS - 如果是这样,相应地改变这一点。第一呼叫创建包括文件,第二个附加到它(双>)...用于FIND / C选项简单地COUNTS包含搜索项的行数。因此,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应如果被检查的体积是NTFS保持0,如果不NTFS和1
或者直接
ExecWait 'chkntfs c: | find /c "NTFS"' $0
$ 0成立的返回码;结果是一种倒退,因为这是错误返回码。如果为0你有NTFS和> 0意味着没有NTFS。
你的测试需要在运行时间,所以 Borzio的 答案不会的工作由本身。
它看起来也像ExecWait命令不允许重新定向,因此它不会的工作来执行这种方式,然后检查的文件内容。
它看起来我喜欢你的最佳选择将挑选一个:
- 使一批文件,该文件将chkntfs然后设置错误水平的基础上的结果
- 编写C/C++/VB/等。应用程序,将运行chkntfs然后设置错误水平的基础上的结果
- 编写C/C++/VB/等。应用程序,将使用Win32Api以确定文件系统
- 写插在对国家统计局,将使用Win32Api以确定文件系统
编辑: Borzio更新他之前我完成了排雷:)
你可能需要添加的东西我发现在的软件论坛: ExecWait与文件重定向
ExpandEnvStrings $1 %COMSPEC%
ExecWait '"$1" /C chkntfs c: | find /c "NTFS"' $0
没有的 ExpandEnvStrings $1 %COMSPEC%
, 它不在我的系统产生重新定向的文件。
我已经测试过的上述,并且它的工作,0刚和1非统。
唯一可能的缺点对于这种方法是命令windows弹出简要在执行代码。