ExecDOS 플러그인을 사용하여 SQL 스크립트를 실행하는 명령 줄 도구를 호출하는 NSIS 설치 관리자가 있습니다. ExecDos는 비동기 모드에서 호출되며 명령 줄 도구가 완료 될 때까지 진행률 막대를 업데이트하고 IsDone 함수를 호출하는 식으로 반복합니다.NSIS ExecDos 플러그인 - IsDone 기능은 일부 컴퓨터에서는 작동하지만 다른 제품에서는 작동하지 않습니다.
내가 겪고있는 문제는 IsDone 검사가 프로세스가 실제로 실행 중일 때 잘못보고되어 설치 프로그램이 완료된 후 백그라운드에서 계속 진행된다는 것입니다. 나는 그것이 작동하지 않는 컴퓨터들 사이에 공통점을 찾을 수 없기 때문에 누군가가 아이디어를 갖고 있거나 코드에서 오류를 발견 할 수 있기를 바라고 있습니다.
Function UpdateDatabase
!insertmacro SetBannerText "Updating database" 0 0
!insertmacro Log "About to update the database"
StrCpy $UpdateDatabase_PreviousScriptNumber 0
SetShellVarContext all
Push "ExecDos::End" # Add a marker for the loop to test for.
ExecDos::exec /NOUNLOAD /ASYNC '"$ComSpec" /S /C ""$INSTDIR\Database\Tool\DatabaseResetTool.Console.exe" -sp="$INSTDIR\Database\Scripts" -cs="Data Source=$DatabaseServer;Initial Catalog=$Database;User ID=sa;Password=*********;Persist Security Info=true;MultipleActiveResultSets=True;Language=English" -eoe"' '' '$APPDATA\Company\$ApplicationPrefix\Database Update.log'
Pop $DatabaseUpdate_ProcessHandle
Loop:
ExecDos::isdone /NOUNLOAD $DatabaseUpdate_ProcessHandle
Pop $DatabaseUpdate_Done
StrCpy $0 "$APPDATA\Company\$ApplicationPrefix\Database Update.log"
StrCpy $1 "$TEMP\Database Update.log"
StrCpy $2 0
System::Call 'kernel32::CopyFile(t r0, t r1, b r2) ?e'
${LineRead} "$TEMP\Database Update.log" "-2" $DatabaseUpdate_LogFileLine
${StrTok} $DatabaseUpdate_LogFileLineEndPart $DatabaseUpdate_LogFileLine "(" "L" "1"
${StrTok} $DatabaseUpdate_ScriptNumber $DatabaseUpdate_LogFileLineEndPart "/" "0" "1"
${StrTok} $DatabaseUpdate_ScriptCountUnprocessed $DatabaseUpdate_LogFileLineEndPart "/" "1" "1"
${StrTok} $DatabaseUpdate_ScriptCount $DatabaseUpdate_ScriptCountUnprocessed ")" "0" "1"
${If} $DatabaseUpdate_ScriptNumber != ""
${AndIf} $DatabaseUpdate_ScriptCount != ""
FloatOp::D $DatabaseUpdate_ScriptNumber $DatabaseUpdate_ScriptCount
FloatOp::M $0 100
${If} $UpdateDatabase_PreviousScriptNumber != $DatabaseUpdate_ScriptNumber
!insertmacro SetBannerText "Updating database$\r$\n$\r$\nRunning script $DatabaseUpdate_ScriptNumber of $DatabaseUpdate_ScriptCount" 0 $0
StrCpy $UpdateDatabase_PreviousScriptNumber $DatabaseUpdate_ScriptNumber
${EndIf}
${EndIf}
Sleep 200
StrCmp $DatabaseUpdate_Done "0" Loop Done
Done:
Push "$TEMP\Database Update.log"
Push "exception"
Call FileSearch
Pop $0
Pop $1
${If} $0 != "0"
StrCpy $InstallError 1
!insertmacro LogError "Database update failed. Please review the 'Database Update.log' to see the detail error message" ""
${EndIf}
FunctionEnd
루프가 깨지면 $ DatabaseUpdate_Done 1 또는 -1이 발생합니까? – Anders