@echo off setlocal EnableDelayedExpansion title inMate - Cai dat tu dong :: ============================================================================ :: install-inmate.cmd - Bo cai dat tu dong cho ung dung inmate :: ============================================================================ :: Tu dong, han che thao tac cua nguoi dung toi da: :: 1. Tu nang quyen quan tri (UAC) neu chua chay voi quyen Administrator. :: 2. Kiem tra Windows 7 da co Service Pack 1 va 2 ban va bat buoc de tin :: cay chu ky SHA-2 (KB4474419, KB4490628) chua - day la dieu kien bat :: buoc truoc khi .NET Framework 4.8 cai duoc tren Windows 7, dung nhu :: README-inmate.md "Cai dat tren Windows 7" da ghi. Khong the tu dong :: tai 2 muc nay (Microsoft chi phat hanh qua Update Catalog, can phien :: lam viec trinh duyet, khong co link tinh de tai thang) - script se mo :: san trang tim kiem tren Update Catalog va dung lai, nguoi dung cai :: xong thi chay lai chinh file install-inmate.cmd nay de tiep tuc (cac buoc da :: xong se tu dong duoc bo qua). :: 3. Kiem tra & cai am tham .NET Framework 4.8 (bo cai offline chinh thuc :: cua Microsoft, /q /norestart - khong hien dialog nao). :: 4. Tai ban inmate moi nhat - dung dung nguon va cach xac dinh file moi :: nhat ma chinh ung dung dung cho tinh nang tu cap nhat cua no (xem :: Services/UpdateService.cs: Cloudflare R2 public bucket, :: /version.json cho so version, :: /inmate-latest.zip cho file) - va giai nen vao :: C:\Program Files\inmate. :: 5. Tao shortcut "inmate" ngoai Desktop. :: :: Cac icon trong giao dien (Helpers/UIHelper.cs) la PNG dong goi san trong :: ban than file .exe, khong con phu thuoc font emoji cua he dieu hanh hay :: tai gi them o buoc cai dat nay nua. :: :: Moi lan chay, toan bo output cua script (ke ca khi loi hoac thoat dot ngot) :: duoc tu dong ghi vao 1 file log rieng (install-log-.txt) ngay :: trong cung thu muc voi file install-inmate.cmd nay, dong thoi van hien tren :: man hinh nhu binh thuong - de tien kiem tra sau nay, dac biet huu ich khi :: debug tren Windows 7. :: ============================================================================ set "INSTALL_DIR=C:\Program Files\inmate" set "TEMP_DIR=%TEMP%\InMateInstall" set "NET48_FWLINK=https://go.microsoft.com/fwlink/?linkid=2088631" if not exist "%TEMP_DIR%" mkdir "%TEMP_DIR%" >nul 2>&1 :: ---- Buoc 0: tu nang quyen Administrator ---------------------------------- net session >nul 2>&1 if %errorlevel% neq 0 ( echo [*] Can quyen Administrator de cai dat - dang yeu cau... powershell -NoProfile -Command "Start-Process -FilePath '%~f0' -Verb RunAs" exit /b ) :: ---- Buoc 0b: tu ghi log toan bo qua trinh cai dat ra file ----------------- :: Chi wrap 1 lan (danh dau bang tham so __LOGGED__) - lan chay ke tiep (da la :: tien trinh Administrator) se thay danh dau nay va bo qua, chay thang phan :: than script ben duoi. Dung "& '%~f0'" (khong dung cmd /c "...") de tranh :: loi nested-quote khi duong dan script co khoang trang. if /I not "%~1"=="__LOGGED__" ( for /f "usebackq delims=" %%T in (`powershell -NoProfile -Command "Get-Date -Format 'yyyyMMdd_HHmmss'"`) do set "LOG_TS=%%T" set "LOG_FILE=%~dp0install-log-!LOG_TS!.txt" echo [*] Dang ghi log cai dat vao: !LOG_FILE! powershell -NoProfile -Command "& { & '%~f0' __LOGGED__ 2>&1 | Tee-Object -FilePath '!LOG_FILE!'; exit $LASTEXITCODE }" set "RC=!errorlevel!" echo. if "!RC!"=="0" ( echo [*] Dang mo inMate... start "" "%INSTALL_DIR%\inmate.exe" ) else ( echo [LOI] Cai dat khong hoan tat - xem log: !LOG_FILE! ) echo. echo Nhan phim bat ky de dong cua so nay. pause >nul exit /b !RC! ) echo ================================================================ echo Cai dat inMate - tu dong echo ================================================================ if defined LOG_FILE echo Log: %LOG_FILE% echo. :: ---- Buoc 1: xac dinh he dieu hanh ----------------------------------------- for /f "usebackq delims=" %%A in (`powershell -NoProfile -Command "(Get-WmiObject Win32_OperatingSystem).Version"`) do set "OS_VER=%%A" for /f "usebackq delims=" %%A in (`powershell -NoProfile -Command "(Get-WmiObject Win32_OperatingSystem).ServicePackMajorVersion"`) do set "OS_SP=%%A" if not defined OS_SP set "OS_SP=0" echo [*] He dieu hanh: Windows NT %OS_VER%, Service Pack %OS_SP% set "IS_WIN7=0" if "%OS_VER:~0,3%"=="6.1" set "IS_WIN7=1" :: ---- Buoc 1b: bat TLS 1.2 o cap he dieu hanh + .NET Framework -------------- :: Tren Windows 7/8/8.1, SChannel co TLS 1.2 nhung MAC DINH TAT ca phia client, :: nen moi ket noi HTTPS toi backend/GitHub bao loi :: "The request was aborted: Could not create SSL/TLS secure channel" - du ban :: than app (Program.Main) da ep ServicePointManager.SecurityProtocol = Tls12, :: vi tang SChannel ben duoi van tu choi. Cac khoa registry duoi day la gia tri :: Microsoft khuyen nghi; vo hai tren Windows 10/11 (da bat san) nen dat luon. echo. echo [*] Bat TLS 1.2 (SChannel + .NET Framework strong crypto)... for %%K in ( "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" ) do ( reg add "%%~K" /v Enabled /t REG_DWORD /d 1 /f >nul 2>&1 reg add "%%~K" /v DisabledByDefault /t REG_DWORD /d 0 /f >nul 2>&1 ) for %%K in ( "HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" "HKLM\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319" ) do ( reg add "%%~K" /v SchUseStrongCrypto /t REG_DWORD /d 1 /f >nul 2>&1 reg add "%%~K" /v SystemDefaultTlsVersions /t REG_DWORD /d 1 /f >nul 2>&1 ) echo [OK] Da bat TLS 1.2. :: ---- Buoc 2: .NET Framework 4.8 -------------------------------------------- :: Kiem tra truoc khi dung toi bat cu dieu kien tien quyet nao cua Windows 7 - :: SP1/KB4474419/KB4490628 chi can thiet de Windows tin tuong CHU KY cua goi :: cai .NET Framework 4.8 chinh thuc tu Microsoft, khong phai de CHAY mot app :: da bien dich cho .NET 4.8. May da co san .NET 4.8 (vi du cai thu cong, hoac :: qua ban Windows Update khac) thi khong can va khong nen bi chan boi cac :: kiem tra danh cho buoc tai/cai o duoi. :: .NET 4.5+ (Release 378389) is what first defines Tls12 on :: SecurityProtocolType. Even when it's installed, powershell.exe on :: Windows 7 still hosts on the old .NET 2.0 CLR by default (PowerShell :: 2.0's own supportedRuntime declares v2.0.50727), whose System.Net :: only knows Ssl3/Tls - so "SecurityProtocol = 3072" throws with :: "the possible enumeration values are Ssl3, Tls" even though 4.8 is :: on disk. COMPLUS_version forces the CLR activation shim to load the :: already-installed v4.0.30319 runtime for every powershell.exe this :: script launches from here on, whose System.Net does define Tls12. :: (This comment block must stay OUTSIDE any parenthesized if/for block - :: cmd.exe still scans "::" lines for paren/quote balance inside a block, :: and the stray ")" above would otherwise close the block early and :: corrupt parsing of everything after it.) :check_net48 echo. echo [*] Kiem tra .NET Framework 4.8... set "NET48_OK=0" set "RELHEX=" for /f "tokens=3" %%A in ('reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release 2^>nul') do set "RELHEX=%%A" if defined RELHEX ( set /a RELDEC=!RELHEX! if !RELDEC! GEQ 528040 set "NET48_OK=1" if !RELDEC! GEQ 378389 set "COMPLUS_version=v4.0.30319" ) if "%NET48_OK%"=="1" ( echo [OK] Da co .NET Framework 4.8 hoac moi hon. goto :download_app ) echo [*] Chua co .NET Framework 4.8 tren may nay. if "%IS_WIN7%"=="1" goto :check_win7_prereqs goto :do_net48_install :check_win7_prereqs if %OS_SP% GEQ 1 goto :check_win7_kb echo. echo [!] May nay la Windows 7 nhung chua co Service Pack 1 SP1. echo .NET Framework 4.8 khong the cai neu thieu SP1, va Microsoft echo khong con phat hanh link tai tinh cho SP1 nen khong the tu dong echo tai o day. Dang mo trang Microsoft Update Catalog de cai thu cong. echo Sau khi cai xong SP1 va KHOI DONG LAI may, chay lai file install-inmate.cmd echo nay de tiep tuc cac buoc con lai. echo. start "" "https://www.catalog.update.microsoft.com/Search.aspx?q=KB976932" exit /b 1 :check_win7_kb echo [*] Kiem tra 2 ban va SHA-2 bat buoc tren Windows 7: KB4474419, KB4490628... set "MISSING_KB=" wmic qfe list | findstr /I "KB4474419" >nul if errorlevel 1 set "MISSING_KB=!MISSING_KB! KB4474419" wmic qfe list | findstr /I "KB4490628" >nul if errorlevel 1 set "MISSING_KB=!MISSING_KB! KB4490628" if not defined MISSING_KB ( echo [OK] Da co du 2 ban va SHA-2. goto :do_net48_install ) echo. echo [!] May nay dang thieu ban va:!MISSING_KB! echo Cac ban va nay bat buoc de Windows tin tuong goi cai .NET Framework echo 4.8 ky bang chu ky SHA-2. Dang mo Microsoft Update Catalog de tai/ echo cai thu cong - khong the tu dong hoa vi trang nay can thao tac echo trinh duyet. Cai xong thi chay lai install-inmate.cmd nay de tiep tuc. echo. start "" "https://www.catalog.update.microsoft.com/Search.aspx?q=KB4474419" start "" "https://www.catalog.update.microsoft.com/Search.aspx?q=KB4490628" exit /b 1 :do_net48_install echo [*] Dang tai bo cai chinh thuc tu Microsoft... set "NET48_EXE=%TEMP_DIR%\ndp48-x86-x64-allos-enu.exe" powershell -NoProfile -Command "[Net.ServicePointManager]::SecurityProtocol = 3072; [Net.WebRequest]::DefaultWebProxy = $null; try { $wc = New-Object Net.WebClient; $wc.Proxy = $null; $wc.DownloadFile('%NET48_FWLINK%', '%NET48_EXE%') } catch { Write-Host $_.Exception.Message; exit 1 }" if errorlevel 1 ( echo [LOI] Khong tai duoc bo cai .NET Framework 4.8. Kiem tra ket noi mang roi chay lai install-inmate.cmd. exit /b 1 ) echo [*] Dang cai .NET Framework 4.8 am tham - khong can thao tac gi... "%NET48_EXE%" /q /norestart set "NET48_RC=%errorlevel%" if "%NET48_RC%"=="0" ( echo [OK] Da cai .NET Framework 4.8 thanh cong. ) else if "%NET48_RC%"=="3010" ( echo [OK] Da cai .NET Framework 4.8 thanh cong - can khoi dong lai may de hoan tat. ) else ( echo [LOI] Cai .NET Framework 4.8 that bai, ma loi %NET48_RC%. echo Neu may la Windows 7, kiem tra lai da cai du SP1 va 2 ban va SHA-2 chua. exit /b 1 ) :: ---- Buoc 3: tai va cai dat ung dung inmate ---------------------------------- :download_app :: Bao dam COMPLUS_version da duoc dat truoc khi goi powershell o duoi - neu :: den duoc day tuc la .NET Framework 4.8 chac chan da co tren may (hoac da co :: san tu truoc, hoac vua duoc cai o buoc 2), nhung nhanh "vua cai xong" :: (do_net48_install) khong doc lai registry nen khong tu dat bien nay. Neu :: thieu, powershell.exe tren Windows 7 van mac dinh chay tren CLR 2.0 cu (theo :: supportedRuntime cua chinh powershell.exe), khien [Net.ServicePointManager] :: ::SecurityProtocol = 3072 (Tls12) o duoi bao loi enum khong hop le du 4.8 da :: nam san tren dia - xem giai thich chi tiet o :check_net48 phia tren. if not defined COMPLUS_version set "COMPLUS_version=v4.0.30319" echo. set "APP_VERSION=UNKNOWN" for /f "usebackq delims=" %%V in (`powershell -NoProfile -EncodedCommand "WwBOAGUAdAAuAFMAZQByAHYAaQBjAGUAUABvAGkAbgB0AE0AYQBuAGEAZwBlAHIAXQA6ADoAUwBlAGMAdQByAGkAdAB5AFAAcgBvAHQAbwBjAG8AbAAgAD0AIAAzADAANwAyAAoAWwBOAGUAdAAuAFcAZQBiAFIAZQBxAHUAZQBzAHQAXQA6ADoARABlAGYAYQB1AGwAdABXAGUAYgBQAHIAbwB4AHkAIAA9ACAAJABuAHUAbABsAAoAdAByAHkAIAB7AAoAIAAgACAAIAAkAHcAYwAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAAKACAAIAAgACAAJAB3AGMALgBQAHIAbwB4AHkAIAA9ACAAJABuAHUAbABsAAoAIAAgACAAIAAkAHcAYwAuAEgAZQBhAGQAZQByAHMALgBBAGQAZAAoACcAVQBzAGUAcgAtAEEAZwBlAG4AdAAnACwAJwBpAG4AbQBhAHQAZQAtAGkAbgBzAHQAYQBsAGwALQBjAG0AZAAnACkACgAgACAAIAAgACQAdAAgAD0AIAAkAHcAYwAuAEQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACcAaAB0AHQAcABzADoALwAvAHAAdQBiAC0AYQAxADgAYQA4ADUAZQBkADIAZAA2ADUANAAwADgAZQA4AGEAMABiADcAYQA1AGQANwA1AGMAOQAyAGIAYgBjAC4AcgAyAC4AZABlAHYALwB2AGUAcgBzAGkAbwBuAC4AagBzAG8AbgAnACkACgAgACAAIAAgAGkAZgAgACgAJAB0ACAALQBtAGEAdABjAGgAIAAnACIAdgBlAHIAcwBpAG8AbgAiAFwAcwAqADoAXABzACoAIgAoAFsAXgAiAF0AKwApACIAJwApACAAewAgAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAkAE0AYQB0AGMAaABlAHMAWwAxAF0AIAB9ACAAZQBsAHMAZQAgAHsAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJwBVAE4ASwBOAE8AVwBOACcAIAB9AAoAfQAgAGMAYQB0AGMAaAAgAHsAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJwBVAE4ASwBOAE8AVwBOACcAIAB9AAoA"`) do set "APP_VERSION=%%V" echo [*] Phien ban moi nhat tren may chu: !APP_VERSION! echo [*] Dang tai inMate !APP_VERSION! tu may chu luu tru (Cloudflare R2)... :: Giai nen bang COM Shell.Application (shell32) thay vi :: System.IO.Compression.FileSystem cua .NET - tren mot so may Windows 7, GAC :: co the thieu/hong assembly nay du .NET Framework 4.8 da cai (ASSEMBLY_NOT_ :: FOUND), trong khi Shell.Application la tinh nang co san cua Windows Explorer :: tu XP/Vista, khong phu thuoc .NET/CLR nao ca nen luon dang tin cay hon. for /f "usebackq delims=" %%A in (`powershell -NoProfile -EncodedCommand "WwBOAGUAdAAuAFMAZQByAHYAaQBjAGUAUABvAGkAbgB0AE0AYQBuAGEAZwBlAHIAXQA6ADoAUwBlAGMAdQByAGkAdAB5AFAAcgBvAHQAbwBjAG8AbAAgAD0AIAAzADAANwAyAAoAWwBOAGUAdAAuAFcAZQBiAFIAZQBxAHUAZQBzAHQAXQA6ADoARABlAGYAYQB1AGwAdABXAGUAYgBQAHIAbwB4AHkAIAA9ACAAJABuAHUAbABsAAoAdAByAHkAIAB7AAoAIAAgACAAIAAkAGQAaQByACAAPQAgAEoAbwBpAG4ALQBQAGEAdABoACAAJABlAG4AdgA6AFQARQBNAFAAIAAnAEkAbgBNAGEAdABlAEkAbgBzAHQAYQBsAGwAJwAKACAAIAAgACAATgBlAHcALQBJAHQAZQBtACAALQBJAHQAZQBtAFQAeQBwAGUAIABEAGkAcgBlAGMAdABvAHIAeQAgAC0ARgBvAHIAYwBlACAALQBQAGEAdABoACAAJABkAGkAcgAgAHwAIABPAHUAdAAtAE4AdQBsAGwACgAgACAAIAAgACQAdwBjACAAPQAgAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0AAoAIAAgACAAIAAkAHcAYwAuAFAAcgBvAHgAeQAgAD0AIAAkAG4AdQBsAGwACgAgACAAIAAgACQAdwBjAC4ASABlAGEAZABlAHIAcwAuAEEAZABkACgAJwBVAHMAZQByAC0AQQBnAGUAbgB0ACcALAAnAGkAbgBtAGEAdABlAC0AaQBuAHMAdABhAGwAbAAtAGMAbQBkACcAKQAKACAAIAAgACAAJAB6AGkAcAAgAD0AIABKAG8AaQBuAC0AUABhAHQAaAAgACQAZABpAHIAIAAnAGkAbgBtAGEAdABlAC4AegBpAHAAJwAKACAAIAAgACAAJABlAHgAdAByAGEAYwB0ACAAPQAgAEoAbwBpAG4ALQBQAGEAdABoACAAJABkAGkAcgAgACcAZQB4AHQAcgBhAGMAdABlAGQAJwAKACAAIAAgACAAJAB3AGMALgBEAG8AdwBuAGwAbwBhAGQARgBpAGwAZQAoACcAaAB0AHQAcABzADoALwAvAHAAdQBiAC0AYQAxADgAYQA4ADUAZQBkADIAZAA2ADUANAAwADgAZQA4AGEAMABiADcAYQA1AGQANwA1AGMAOQAyAGIAYgBjAC4AcgAyAC4AZABlAHYALwBpAG4AbQBhAHQAZQAtAGwAYQB0AGUAcwB0AC4AegBpAHAAJwAsACAAJAB6AGkAcAApAAoAIAAgACAAIABpAGYAIAAoAFQAZQBzAHQALQBQAGEAdABoACAAJABlAHgAdAByAGEAYwB0ACkAIAB7ACAAUgBlAG0AbwB2AGUALQBJAHQAZQBtACAAJABlAHgAdAByAGEAYwB0ACAALQBSAGUAYwB1AHIAcwBlACAALQBGAG8AcgBjAGUAIAB9AAoAIAAgACAAIABOAGUAdwAtAEkAdABlAG0AIAAtAEkAdABlAG0AVAB5AHAAZQAgAEQAaQByAGUAYwB0AG8AcgB5ACAALQBGAG8AcgBjAGUAIAAtAFAAYQB0AGgAIAAkAGUAeAB0AHIAYQBjAHQAIAB8ACAATwB1AHQALQBOAHUAbABsAAoAIAAgACAAIAAkAHMAaABlAGwAbAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAALQBDAG8AbQBPAGIAagBlAGMAdAAgAFMAaABlAGwAbAAuAEEAcABwAGwAaQBjAGEAdABpAG8AbgAKACAAIAAgACAAJAB6AGkAcABGAG8AbABkAGUAcgAgAD0AIAAkAHMAaABlAGwAbAAuAE4AYQBtAGUAUwBwAGEAYwBlACgAJAB6AGkAcAApAAoAIAAgACAAIABpAGYAIAAoACQAegBpAHAARgBvAGwAZABlAHIAIAAtAGUAcQAgACQAbgB1AGwAbAApACAAewAgAHQAaAByAG8AdwAgACcASwBoAG8AbgBnACAAZABvAGMAIABkAHUAbwBjACAAZgBpAGwAZQAgAHoAaQBwACAAdgB1AGEAIAB0AGEAaQAgAHYAZQAgACgAYwBvACAAdABoAGUAIABiAGkAIABoAG8AbgBnACkALgAnACAAfQAKACAAIAAgACAAJABpAHQAZQBtAHMAIAA9ACAAJAB6AGkAcABGAG8AbABkAGUAcgAuAEkAdABlAG0AcwAoACkACgAgACAAIAAgACQAdABvAHQAYQBsACAAPQAgACQAaQB0AGUAbQBzAC4AQwBvAHUAbgB0AAoAIAAgACAAIAAkAGQAZQBzAHQARgBvAGwAZABlAHIAIAA9ACAAJABzAGgAZQBsAGwALgBOAGEAbQBlAFMAcABhAGMAZQAoACQAZQB4AHQAcgBhAGMAdAApAAoAIAAgACAAIAAkAGQAZQBzAHQARgBvAGwAZABlAHIALgBDAG8AcAB5AEgAZQByAGUAKAAkAGkAdABlAG0AcwAsACAAMgAwACkACgAgACAAIAAgACQAZABlAGEAZABsAGkAbgBlACAAPQAgACgARwBlAHQALQBEAGEAdABlACkALgBBAGQAZABNAGkAbgB1AHQAZQBzACgANQApAAoAIAAgACAAIAB3AGgAaQBsAGUAIAAoACQAZABlAHMAdABGAG8AbABkAGUAcgAuAEkAdABlAG0AcwAoACkALgBDAG8AdQBuAHQAIAAtAGwAdAAgACQAdABvAHQAYQBsACAALQBhAG4AZAAgACgARwBlAHQALQBEAGEAdABlACkAIAAtAGwAdAAgACQAZABlAGEAZABsAGkAbgBlACkAIAB7AAoAIAAgACAAIAAgACAAIAAgAFMAdABhAHIAdAAtAFMAbABlAGUAcAAgAC0ATQBpAGwAbABpAHMAZQBjAG8AbgBkAHMAIAA1ADAAMAAKACAAIAAgACAAfQAKACAAIAAgACAAUwB0AGEAcgB0AC0AUwBsAGUAZQBwACAALQBTAGUAYwBvAG4AZABzACAAMQAKACAAIAAgACAAVwByAGkAdABlAC0ASABvAHMAdAAgACQAZQB4AHQAcgBhAGMAdAAKACAAIAAgACAAZQB4AGkAdAAgADAACgB9ACAAYwBhAHQAYwBoACAAewAKACAAIAAgACAAVwByAGkAdABlAC0ASABvAHMAdAAgACgAJwBFAFIAUgBPAFIAOgAgACcAIAArACAAJABfAC4ARQB4AGMAZQBwAHQAaQBvAG4ALgBNAGUAcwBzAGEAZwBlACkACgAgACAAIAAgAGUAeABpAHQAIAAxAAoAfQAKAA=="`) do set "APP_EXTRACT=%%A" echo %APP_EXTRACT% | findstr /B "ERROR:" >nul if not errorlevel 1 ( echo [LOI] %APP_EXTRACT% echo Kiem tra ket noi mang roi chay lai install-inmate.cmd. exit /b 1 ) if not defined APP_EXTRACT ( echo [LOI] Khong tai/giai nen duoc ban inmate moi nhat. exit /b 1 ) echo [OK] Da tai va giai nen: %APP_EXTRACT% echo. echo [*] Dang dong inMate neu dang chay (de giai phong file ban cu)... taskkill /F /IM inmate.exe /T >nul 2>&1 if %errorlevel% equ 0 ( echo [OK] Da dong inMate dang chay. REM Cho tien trinh cu giai phong hoan toan file .exe/.dll truoc khi ghi de - REM taskkill tra ve ngay sau khi gui tin hieu terminate, chua chac process REM da thoat han va nha file handle kip luc robocopy chay ben duoi. timeout /t 2 /nobreak >nul 2>&1 ) else ( echo [OK] inMate hien khong chay. ) echo [*] Dang cai vao "%INSTALL_DIR%"... if not exist "%INSTALL_DIR%" mkdir "%INSTALL_DIR%" :: /MIR (mirror) thay vi /E - dam bao ban cu bi xoa sach truoc khi ban moi :: nhat duoc dua vao: ngoai ghi de file trung ten, /MIR con XOA moi file/thu :: muc con sot lai trong dich ma khong con ton tai trong ban giai nen moi (vi :: du: 1 ban cu co file/DLL da bi go bo o ban moi) - tranh tinh trang cai :: "chong" nhieu phien ban lam mot, lam sai lech nhung tien trinh tu cap nhat :: hoac gay xung dot phien ban DLL. /R:3 /W:2: neu con file nao bi khoa (vi du :: tien trinh cu chua kip thoat han) thi thu lai toi da 3 lan, cach nhau 2s, :: thay vi robocopy mac dinh thu lai 1 trieu lan va treo ca script. robocopy "%APP_EXTRACT%" "%INSTALL_DIR%" /MIR /R:3 /W:2 /NFL /NDL /NJH /NJS /NC /NS /NP >nul if %errorlevel% GEQ 8 ( echo [LOI] Khong sao chep duoc file vao "%INSTALL_DIR%". echo Neu inMate van dang chay (vi du tu 1 cua so khac), hay dong het echo roi chay lai install-inmate.cmd. exit /b 1 ) echo [OK] Da xoa ban cu (neu co) va cai ban moi nhat vao "%INSTALL_DIR%". :: ---- Buoc 4: tao shortcut ngoai Desktop ------------------------------------- echo. echo [*] Dang tao shortcut inMate ngoai Desktop... powershell -NoProfile -Command "$ws = New-Object -ComObject WScript.Shell; $desktop = [Environment]::GetFolderPath('Desktop'); $lnk = $ws.CreateShortcut([System.IO.Path]::Combine($desktop, 'inmate.lnk')); $lnk.TargetPath = '%INSTALL_DIR%\inmate.exe'; $lnk.WorkingDirectory = '%INSTALL_DIR%'; $lnk.IconLocation = '%INSTALL_DIR%\inmate.exe'; $lnk.Save()" if errorlevel 1 ( echo [!] Khong tao duoc shortcut - co the tu tao thu cong tu "%INSTALL_DIR%\inmate.exe". ) else ( echo [OK] Da tao shortcut inMate ngoai Desktop. ) rmdir /s /q "%TEMP_DIR%" >nul 2>&1 echo. echo ================================================================ echo Cai dat hoan tat! echo ================================================================ if defined LOG_FILE echo Log cai dat: %LOG_FILE% echo Phien ban da cai: !APP_VERSION! echo. exit /b 0