Определение, является ли целевой том NTFS с использованием NSIS - PullRequest
0 голосов
/ 28 января 2009

Я создаю установщик с NSIS для программы, которая должна работать на томе NTFS. Как определить, находится ли путь установки на томе NTFS, и действовать соответствующим образом (показать справку / предупреждение)?

Ответы [ 3 ]

3 голосов
/ 08 апреля 2009

Использование внешних инструментов - не всегда хорошая идея (не все инструменты командной строки существуют в версиях Windows Home). Всегда лучше вызывать правильный 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}
1 голос
/ 28 января 2009

Ваш тест должен быть во время выполнения, поэтому Ответ Борцио не будет работать сам по себе.

Похоже, что команда ExecWait не разрешает перенаправление, поэтому она не будет работать для ее выполнения и проверки содержимого файла.

Мне кажется, что вам лучше всего выбрать один из:

  • создать пакетный файл, который будет запускать chkntfs, а затем установить уровень ошибки на основе результата
  • написать C / C ++ / VB / и т. Д. приложение, которое запускает chkntfs, а затем устанавливает уровень ошибки на основе результата
  • написать C / C ++ / VB / и т.д. приложение, которое будет использовать Win32 API для определения файловой системы
  • написать плагин для NSIS, который будет использовать Win32 API для определения файловой системы

Редактировать: Борцио обновил его до того, как я закончил свой:)

Вам может понадобиться добавить что-то, что я нашел на форумах Winamp: ExecWait с перенаправлением файлов

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

Без ExpandEnvStrings $1 %COMSPEC% в моей системе не работало создание перенаправленного файла.

Я протестировал выше, и это работает, 0 для NTFS и 1 для не NTFS.

Единственный возможный недостаток этого метода - кратковременное всплывающее окно команд во время выполнения кода.

1 голос
/ 28 января 2009

Я не знаком с NSIS, но вам может пригодиться этот маленький трюк "DOS".

Я заметил, что с NSIS можно открыть файл, так что это может помочь -

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

CHKNTFS - это утилита для управления операциями CHKDSK, но если вы запускаете команду без переключателей командной строки, она просто сообщает о результатах.

"C:" - это интересующий вас диск -

Вы можете запустить это из командной строки, чтобы увидеть результат, без "> yourfile.abc" конечно, часть, которая направляет вывод в этот файл.

Прежде чем кто-то проголосует против этого, я просто предлагаю это как мысль, провоцирующую ПРЕДЛОЖЕНИЕ, возможно, вызывающую реальное решение, и помните ТАК девиз - будь добрым ... лол ...

РЕДАКТИРОВАТЬ: этот фрагмент может помочь - у меня нет способа действительно проверить это - это полное использование времени - и вы, скорее всего, захотите RUN-TIME ... НО, это может дать вам идею .. .

Я "предполагаю", что нет определения, уже названного NTFS - если так, измените это соответственно. Первый вызов СОЗДАЕТ включаемый файл, второй ПРИНИМАЕТ к нему (double>) ... Параметр / C для FIND просто СЧИТАЕТ числовые строки, содержащие элемент поиска. Следовательно, результат 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

РЕДАКТИРОВАТЬ: (опять же, LOL)

вот фрагмент, который установит переменную ENVIRONMENT, которая, насколько я могу судить, должна быть довольно легко читаемой во время выполнения - вы могли бы создать переменную для выполнения, соответственно заменив букву диска.

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

Теперь переменная среды NTFS должна содержать 0, если не NTFS, и 1, если проверяемый том IS NTFS.

или напрямую

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

$ 0 содержит код возврата; Результаты в некотором роде обратные, так как это код возврата ERROR. Если 0, то у вас есть NTFS, а> 0 означает, что нет NTFS.

...