我正在创造一个安装与国家统计局的程序需要运行在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弹出简要在执行代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top