문제

NTFS 볼륨에서 실행 해야하는 프로그램을 위해 NSIS가 포함 된 설치 프로그램을 만들고 있습니다. 경로에 대한 설치가 NTFS 볼륨에 있는지 여부를 어떻게 감지하고 그에 따라 행동합니까 (도움말/경고 메시지 표시)?

도움이 되었습니까?

해결책

외부 도구를 사용하는 것이 항상 좋은 아이디어는 아닙니다 (모든 명령 줄 도구가 홈 버전의 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}

다른 팁

나는 NSI에 익숙하지 않지만이 작은 "dos"트릭이 도움이 될 수 있습니다.

NSIS로 파일을 열 수 있다는 것을 알았으므로 도움이 될 수 있습니다.

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

CHKNTFS는 CHKDSK 작업을 관리하는 유틸리티이지만 명령 줄 스위치가없는 명령을 실행하면 결과를보고합니다.

"C :"는 당신이 관심있는 드라이브입니다.

명령 프롬프트에서 이것을 실행하여 결과를 확인할 수 있습니다. "> Yourfile.abc"물론, 그것은 출력을 해당 파일로 지시하는 것입니다.

누군가가 투표하기 전에, 나는 단지 그것을 생각으로 제안하는 제안으로, 아마도 실제 해결책을 불러 일으키고 모토를 기억하십시오 - 친절한 ... lol ...

편집 :이 스 니펫은 도움이 될 수 있습니다. 실제로 이것을 테스트 할 방법이 없습니다. 이것은 컴파일 시간 사용량입니다.

이미 명명 된 NTFS가 정의되지 않는다고 가정합니다. 그렇다면 이에 따라 변경하십시오. 첫 번째 호출은 포함 파일을 작성하고, 두 번째는 파일에 추가됩니다 (Double>) ... 찾기위한 /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

편집 : (다시, lol)

다음은 환경 변수를 설정하는 스 니펫이 있습니다. 내가 말할 수있는 것부터 런타임 중에 읽기 쉽게 읽을 수 있어야합니다. 이에 따라 드라이브 문자를 대체하여 실행할 변수를 구성 할 수 있습니다.

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

이제 NTFS라는 환경 변수는 NTF가 아닌 경우 0을 유지하고 검사되는 부피가 NTF 인 경우 1을 유지해야합니다.

또는 직접

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

$ 0는 반환 코드를 보유합니다. 오류 반환 코드이므로 결과는 역전입니다. 0 인 경우 NTFS가 있고> 0은 NTF가 없음을 의미합니다.

테스트는 런타임에 있어야하므로 보르 지오의 답은 그 자체로 작동하지 않을 것입니다.

또한 execwait 명령이 리디렉션을 허용하지 않는 것처럼 보이므로이를 실행하고 파일의 내용을 확인하는 것이 작동하지 않습니다.

최선의 옵션이 다음 중 하나를 선택하는 것입니다.

  • chkntfs를 실행하는 배치 파일을 만든 다음 결과에 따라 오류 레벨을 설정하십시오.
  • C/C ++/VB/등을 작성하십시오. chkntfs를 실행 한 다음 결과를 기반으로 오류 레벨을 설정하는 앱
  • C/C ++/VB/등을 작성하십시오. Win32 API를 사용하여 파일 시스템을 결정하는 앱
  • Win32 API를 사용하여 FileSystem을 결정하는 NSIS 용 플러그인 작성

편집하다: Borzio는 내가 끝나기 전에 그의 업데이트 :)

Winamp 포럼에서 찾은 것을 추가해야 할 수도 있습니다. 파일 리디렉션이있는 execwait

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

없이 ExpandEnvStrings $1 %COMSPEC%, 리디렉션 된 파일을 생성하기 위해 내 시스템에서 작동하지 않았습니다.

위의 테스트를 테스트했는데 NTF의 경우 0, NTF가 아닌 경우 작동합니다.

이 방법의 유일한 단점은 코드 실행 중에 명령 Windows가 간단히 나타나는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top