mirror of
https://github.com/jazir555/GamesDows.git
synced 2025-08-01 19:06:43 +02:00
Compare commits
93 Commits
jazir555-t
...
v5
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c7a2576da4 | ||
![]() |
7f6e185a02 | ||
![]() |
5866c13782 | ||
![]() |
8bd670dfc7 | ||
![]() |
06c1cb02d6 | ||
![]() |
d49ff27ad4 | ||
![]() |
7e842382cf | ||
![]() |
ac3ff0bb1b | ||
![]() |
a5af0188b1 | ||
![]() |
e6b15506fd | ||
![]() |
6e5d28bf6b | ||
![]() |
c1125b3376 | ||
![]() |
8ca56ed459 | ||
![]() |
a5c0d26e6f | ||
![]() |
d883fd4115 | ||
![]() |
5f1428c7e3 | ||
![]() |
51d6fab016 | ||
![]() |
345f25cbad | ||
![]() |
38358751d5 | ||
![]() |
e0f9bf46d6 | ||
![]() |
befd6aa4f2 | ||
![]() |
bc141c3e1a | ||
![]() |
d1b7a444e2 | ||
![]() |
0c84d93c33 | ||
![]() |
d250d40338 | ||
![]() |
7e4caac315 | ||
![]() |
14313ea3f1 | ||
![]() |
59ae9686d2 | ||
![]() |
deba33efaf | ||
![]() |
55e2475630 | ||
![]() |
4153a4336c | ||
![]() |
b744ddd6c4 | ||
![]() |
5e34182874 | ||
![]() |
e4f338cd8e | ||
![]() |
15a435d27d | ||
![]() |
4fe8c7940b | ||
![]() |
48252f8b93 | ||
![]() |
6c3af61908 | ||
![]() |
be6a79d69e | ||
![]() |
f75b84da19 | ||
![]() |
c182353a1c | ||
![]() |
fbcfb0233a | ||
![]() |
ddd8f47539 | ||
![]() |
60e74326b5 | ||
![]() |
db866f23ff | ||
![]() |
3955f66bab | ||
![]() |
aa634a73cd | ||
![]() |
03500223c3 | ||
![]() |
0c480d73cc | ||
![]() |
95af8c00c2 | ||
![]() |
3bcc7e23ca | ||
![]() |
aed71b8b75 | ||
![]() |
510c83c9e6 | ||
![]() |
53f85a79f2 | ||
![]() |
5f34c3463d | ||
![]() |
18cd022c6a | ||
![]() |
f9856390eb | ||
![]() |
80febfccb4 | ||
![]() |
3480682dc7 | ||
![]() |
85e96a2efa | ||
![]() |
a1def078e9 | ||
![]() |
d952788a6c | ||
![]() |
5c20217813 | ||
![]() |
a9dc4301e7 | ||
![]() |
9f1ace084b | ||
![]() |
143f73f5c2 | ||
![]() |
531da7ee39 | ||
![]() |
72e754faa4 | ||
![]() |
1780390c80 | ||
![]() |
ac114bc5f6 | ||
![]() |
83eab8cfb7 | ||
![]() |
ab12c08ce6 | ||
![]() |
aa142f68fc | ||
![]() |
636502a654 | ||
![]() |
a82e052126 | ||
![]() |
c61f5697bd | ||
![]() |
cd03f3b816 | ||
![]() |
73733e5b2d | ||
![]() |
a4ab3669dd | ||
![]() |
abcb0e07db | ||
![]() |
a631c5cb20 | ||
![]() |
6dfbecdce9 | ||
![]() |
59e190f499 | ||
![]() |
429a799410 | ||
![]() |
43ab18cf33 | ||
![]() |
9153e24b96 | ||
![]() |
9e6b7096d9 | ||
![]() |
df6e357429 | ||
![]() |
e21fc465cd | ||
![]() |
1dae7faaf8 | ||
![]() |
5558beb5d6 | ||
![]() |
c604af7631 | ||
![]() |
374831a04e |
@@ -1,38 +0,0 @@
|
||||
@echo off
|
||||
SETLOCAL EnableExtensions EnableDelayedExpansion
|
||||
|
||||
echo Reverting changes and setting default shell back to Explorer
|
||||
|
||||
:: Reset the default shell to Explorer
|
||||
SET "EXPLORER_PATH=C:\Windows\explorer.exe"
|
||||
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "C:\Windows\explorer.exe" /f
|
||||
|
||||
:: Define the default Steam folder path
|
||||
SET "STEAM_FOLDER=C:\Program Files (x86)\Steam"
|
||||
|
||||
:: Delete the DelayedExplorerStart.bat script and related files
|
||||
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
|
||||
SET "SCRIPT_PATH=%STEAM_FOLDER%\%SCRIPT_NAME%"
|
||||
IF EXIST "%SCRIPT_PATH%" DEL "%SCRIPT_PATH%"
|
||||
|
||||
SET "VBS_NAME=RunBatchSilently.vbs"
|
||||
SET "VBS_PATH=%STEAM_FOLDER%\%VBS_NAME%"
|
||||
IF EXIST "%VBS_PATH%" DEL "%VBS_PATH%"
|
||||
|
||||
SET "XML_NAME=DelayedExplorerStartTask.xml"
|
||||
SET "XML_PATH=%STEAM_FOLDER%\%XML_NAME%"
|
||||
IF EXIST "%XML_PATH%" DEL "%XML_PATH%"
|
||||
|
||||
:: Delete the scheduled task
|
||||
schtasks /delete /tn "RunDelayedExplorerStart" /f
|
||||
|
||||
:: Disable automatic logon
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 0 /f
|
||||
reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /f
|
||||
|
||||
:: Enable the boot UI
|
||||
bcdedit.exe -set {globalsettings} bootuxdisabled off
|
||||
|
||||
echo Reversion complete. Default settings restored.
|
||||
|
||||
pause
|
89
Disable Gamesdows V2.bat
Normal file
89
Disable Gamesdows V2.bat
Normal file
@@ -0,0 +1,89 @@
|
||||
@echo off
|
||||
SETLOCAL EnableExtensions EnableDelayedExpansion
|
||||
|
||||
:: Define paths and names
|
||||
SET "STEAM_FOLDER=C:\Program Files (x86)\Steam"
|
||||
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
|
||||
SET "SCRIPT_PATH=%STEAM_FOLDER%\%SCRIPT_NAME%"
|
||||
SET "VBS_NAME=RunBatchSilently.vbs"
|
||||
SET "VBS_PATH=%STEAM_FOLDER%\%VBS_NAME%"
|
||||
SET "XML_NAME=DelayedExplorerStartTask.xml"
|
||||
SET "XML_PATH=%STEAM_FOLDER%\%XML_NAME%"
|
||||
|
||||
echo ================================
|
||||
echo Disabling GamesDows
|
||||
echo ================================
|
||||
|
||||
:: Reset the default shell to Explorer
|
||||
echo [1/5] Resetting default shell to Explorer...
|
||||
REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "C:\Windows\explorer.exe" /f
|
||||
if ERRORLEVEL 1 (
|
||||
echo [ERROR] Failed to reset the default shell.
|
||||
goto end
|
||||
) else (
|
||||
echo [SUCCESS] Default shell reset to Explorer.
|
||||
)
|
||||
|
||||
:: Terminate Steam processes to ensure changes take effect
|
||||
echo [2/5] Terminating Steam processes...
|
||||
taskkill /IM "Steam.exe" /F >nul 2>&1
|
||||
taskkill /IM "SteamService.exe" /F >nul 2>&1
|
||||
echo [INFO] Steam processes terminated.
|
||||
|
||||
:: Delete the DelayedExplorerStart.bat script
|
||||
echo [3/5] Deleting DelayedExplorerStart.bat...
|
||||
IF EXIST "%SCRIPT_PATH%" (
|
||||
DEL /F /Q "%SCRIPT_PATH%"
|
||||
if ERRORLEVEL 1 (
|
||||
echo [WARNING] Could not delete %SCRIPT_NAME%.
|
||||
) else (
|
||||
echo [SUCCESS] %SCRIPT_NAME% deleted.
|
||||
)
|
||||
) else (
|
||||
echo [INFO] %SCRIPT_NAME% does not exist.
|
||||
)
|
||||
|
||||
:: Delete the RunBatchSilently.vbs script
|
||||
echo [4/5] Deleting RunBatchSilently.vbs...
|
||||
IF EXIST "%VBS_PATH%" (
|
||||
DEL /F /Q "%VBS_PATH%"
|
||||
if ERRORLEVEL 1 (
|
||||
echo [WARNING] Could not delete %VBS_NAME%.
|
||||
) else (
|
||||
echo [SUCCESS] %VBS_NAME% deleted.
|
||||
)
|
||||
) else (
|
||||
echo [INFO] %VBS_NAME% does not exist.
|
||||
)
|
||||
|
||||
:: Delete the DelayedExplorerStartTask.xml file
|
||||
echo [5/5] Deleting DelayedExplorerStartTask.xml...
|
||||
IF EXIST "%XML_PATH%" (
|
||||
DEL /F /Q "%XML_PATH%"
|
||||
if ERRORLEVEL 1 (
|
||||
echo [WARNING] Could not delete %XML_NAME%.
|
||||
) else (
|
||||
echo [SUCCESS] %XML_NAME% deleted.
|
||||
)
|
||||
) else (
|
||||
echo [INFO] %XML_NAME% does not exist.
|
||||
)
|
||||
|
||||
:: Delete the scheduled task
|
||||
echo [6/6] Deleting scheduled task 'RunDelayedExplorerStart'...
|
||||
schtasks /delete /tn "RunDelayedExplorerStart" /f >nul 2>&1
|
||||
if ERRORLEVEL 1 (
|
||||
echo [WARNING] Could not delete the scheduled task 'RunDelayedExplorerStart'.
|
||||
) else (
|
||||
echo [SUCCESS] Scheduled task 'RunDelayedExplorerStart' deleted.
|
||||
)
|
||||
|
||||
echo.
|
||||
echo ================================
|
||||
echo GamesDows has been disabled successfully.
|
||||
echo A system restart is recommended for all changes to take effect.
|
||||
echo ================================
|
||||
|
||||
:end
|
||||
ENDLOCAL
|
||||
pause
|
137
Enable GamesDows Playnite.bat
Normal file
137
Enable GamesDows Playnite.bat
Normal file
@@ -0,0 +1,137 @@
|
||||
@echo off
|
||||
SETLOCAL EnableExtensions EnableDelayedExpansion
|
||||
|
||||
echo Setting Playnite as default shell
|
||||
|
||||
SET "KEY_NAME=HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
|
||||
SET "VALUE_NAME=Shell"
|
||||
SET "PLAYNITE_FOLDER=%LOCALAPPDATA%\Playnite"
|
||||
SET "PLAYNITE_PATH=%LOCALAPPDATA%\Playnite\Playnite.FullscreenApp.exe"
|
||||
REG ADD "%KEY_NAME%" /v %VALUE_NAME% /t REG_SZ /d "%PLAYNITE_PATH%" /f
|
||||
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
|
||||
SET "SCRIPT_PATH=%PLAYNITE_FOLDER%\%SCRIPT_NAME%"
|
||||
SET "EXPLORER_PATH=C:\Windows\explorer.exe"
|
||||
SET "VBS_NAME=RunBatchSilently.vbs"
|
||||
SET "VBS_PATH=%PLAYNITE_FOLDER%\%VBS_NAME%"
|
||||
|
||||
echo Creating DelayedExplorerStart.bat script
|
||||
|
||||
echo Create the DelayedExplorerStart.bat script in the Playnite folder
|
||||
(
|
||||
echo @echo off
|
||||
echo rem Check if user is logged on
|
||||
echo whoami ^| find /i "%USERNAME%" ^>nul
|
||||
echo if ERRORLEVEL 1 exit
|
||||
echo rem Set Shell back to Explorer
|
||||
echo REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%EXPLORER_PATH%" /f
|
||||
echo timeout /t 20 /nobreak ^>nul
|
||||
echo start C:\Windows\explorer.exe
|
||||
echo timeout /t 10 /nobreak ^>nul
|
||||
echo REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%PLAYNITE_PATH%" /f
|
||||
) > "%SCRIPT_PATH%"
|
||||
|
||||
|
||||
echo %VBS_PATH%
|
||||
|
||||
echo Creating RunBatchSilently.vbs script
|
||||
|
||||
rem Create VBScript to run the batch file silently
|
||||
echo Set WshShell = CreateObject("WScript.Shell") > "%VBS_PATH%"
|
||||
echo WshShell.Run chr(34)^&"%SCRIPT_PATH%"^&chr(34), 0, True >> "%VBS_PATH%"
|
||||
echo Set WshShell = Nothing >> "%VBS_PATH%"
|
||||
|
||||
echo Create XML file for the scheduled task
|
||||
SET XML_PATH=%PLAYNITE_FOLDER%\DelayedExplorerStartTask.xml
|
||||
|
||||
echo Delete the existing XML file if it exists
|
||||
IF EXIST "%XML_PATH%" DEL "%XML_PATH%"
|
||||
|
||||
(
|
||||
echo ^<?xml version="1.0" encoding="UTF-16"?^>
|
||||
echo ^<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"^>
|
||||
echo ^<RegistrationInfo^>
|
||||
echo ^<Date^>2020-01-01T00:00:00^</Date^>
|
||||
echo ^<Author^>"%USERNAME%"^</Author^>
|
||||
echo ^<Description^>Run DelayedExplorerStart.bat at logon.^</Description^>
|
||||
echo ^</RegistrationInfo^>
|
||||
echo ^<Triggers^>
|
||||
echo ^<LogonTrigger^>
|
||||
echo ^<Enabled^>true^</Enabled^>
|
||||
echo ^</LogonTrigger^>
|
||||
echo ^</Triggers^>
|
||||
echo ^<Principals^>
|
||||
echo ^<Principal id="Author"^>
|
||||
echo ^<UserId^>%USERNAME%</UserId^>
|
||||
echo ^<LogonType^>InteractiveToken^</LogonType^>
|
||||
echo ^<RunLevel^>HighestAvailable^</RunLevel^>
|
||||
echo ^</Principal^>
|
||||
echo ^</Principals^>
|
||||
echo ^<Settings^>
|
||||
echo ^<MultipleInstancesPolicy^>IgnoreNew^</MultipleInstancesPolicy^>
|
||||
echo ^<DisallowStartIfOnBatteries^>false^</DisallowStartIfOnBatteries^>
|
||||
echo ^<StopIfGoingOnBatteries^>false^</StopIfGoingOnBatteries^>
|
||||
echo ^<AllowHardTerminate^>true^</AllowHardTerminate^>
|
||||
echo ^<StartWhenAvailable^>true^</StartWhenAvailable^>
|
||||
echo ^<RunOnlyIfNetworkAvailable^>false^</RunOnlyIfNetworkAvailable^>
|
||||
echo ^<IdleSettings^>
|
||||
echo ^<StopOnIdleEnd^>true^</StopOnIdleEnd^>
|
||||
echo ^<RestartOnIdle^>false^</RestartOnIdle^>
|
||||
echo ^</IdleSettings^>
|
||||
echo ^<Enabled^>true^</Enabled^>
|
||||
echo ^<Hidden^>false^</Hidden^>
|
||||
echo ^<WakeToRun^>false^</WakeToRun^>
|
||||
echo ^<ExecutionTimeLimit^>PT72H^</ExecutionTimeLimit^>
|
||||
echo ^<Priority^>7^</Priority^>
|
||||
echo ^</Settings^>
|
||||
echo ^<Actions Context="Author"^>
|
||||
echo ^<Exec^>
|
||||
echo ^<Command^>wscript.exe^</Command^>
|
||||
echo ^<Arguments^>"%VBS_PATH%"^</Arguments^>
|
||||
echo ^</Exec^>
|
||||
echo ^</Actions^>
|
||||
echo ^</Task^>
|
||||
) > "%XML_PATH%"
|
||||
|
||||
echo Delete the existing scheduled task if it exists
|
||||
schtasks /delete /tn "RunDelayedExplorerStart" /f /ru "%USERNAME%"
|
||||
|
||||
echo Create the scheduled task using the XML file
|
||||
schtasks /create /tn "RunDelayedExplorerStart" /xml "%XML_PATH%" /ru "%USERNAME%"
|
||||
|
||||
echo Delayed Explorer start script and VBScript created in Playnite folder.
|
||||
echo Scheduled Task added to run the script at logon.
|
||||
echo XML file for Scheduled Task created.
|
||||
|
||||
echo Disable the boot UI
|
||||
bcdedit.exe -set {globalsettings} bootuxdisabled on
|
||||
|
||||
echo Disable Logon UI
|
||||
|
||||
reg add "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DisableLogonUI /t REG_DWORD /d 1 /f
|
||||
|
||||
echo Disable Visual Effects
|
||||
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v VisualEffects /t REG_DWORD /d 3 /f
|
||||
|
||||
echo Increase File System Performance
|
||||
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /v NtfsDisableLastAccessUpdate /t REG_DWORD /d 1 /f
|
||||
|
||||
echo Optimize Paging File Performance
|
||||
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v DisablePagingExecutive /t REG_DWORD /d 1 /f
|
||||
|
||||
echo Disable Startup Delay
|
||||
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" /f
|
||||
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" /v StartupDelayInMSec /t REG_DWORD /d 0 /f
|
||||
|
||||
echo Improve Windows Explorer Process Priority
|
||||
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\explorer.exe\PerfOptions" /v CpuPriorityClass /t REG_DWORD /d 3 /f
|
||||
echo Adjust Large System Cache
|
||||
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v LargeSystemCache /t REG_DWORD /d 1 /f
|
||||
echo Enabling No GUI Boot
|
||||
bcdedit /set {current} quietboot on
|
||||
|
||||
echo Registry modifications are complete.
|
||||
echo Playnite set as default shell.
|
||||
echo Automatic logon enabled.
|
||||
echo Boot UI disabled.
|
||||
|
||||
pause
|
@@ -4,9 +4,9 @@ SETLOCAL EnableExtensions
|
||||
echo Setting Steam Big Picture as default shell
|
||||
|
||||
echo Set Steam Big Picture as the default shell
|
||||
SET "KEY_NAME=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
|
||||
SET "KEY_NAME=HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
|
||||
SET "VALUE_NAME=Shell"
|
||||
SET "STEAM_PATH=C:\Program Files (x86)\Steam\Steam.exe -bigpicture -silent -nobootstrapupdate -skipinitialbootstrap -skipverifyfiles"
|
||||
SET "STEAM_PATH=C:\Program Files (x86)\Steam\Steam.exe -bigpicture -nobootstrapupdate -skipinitialbootstrap -skipverifyfiles"
|
||||
REG ADD "%KEY_NAME%" /v %VALUE_NAME% /t REG_SZ /d "%STEAM_PATH%" /f
|
||||
|
||||
@echo off
|
||||
@@ -15,43 +15,48 @@ SETLOCAL EnableExtensions EnableDelayedExpansion
|
||||
echo Define the default Steam folder path and script names
|
||||
SET "STEAM_FOLDER=C:\Program Files (x86)\Steam"
|
||||
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
|
||||
SET "SCRIPT_NAME1=StartSteamAsAdmin.bat"
|
||||
SET "SCRIPT_PATH=%STEAM_FOLDER%\%SCRIPT_NAME%"
|
||||
SET "SCRIPT_PATH1=%STEAM_FOLDER%\%SCRIPT_NAME1%"
|
||||
|
||||
SET "SCRIPT_PATH1=%STEAM_FOLDER%\%SCRIPT_NAME%"
|
||||
SET "EXPLORER_PATH=C:\Windows\explorer.exe"
|
||||
SET "MANIFEST_PATH=%STEAM_PATH%.manifest"
|
||||
|
||||
echo Creating StartSteamAsAdmin.bat script
|
||||
:: Create the manifest file to force admin privileges for Steam
|
||||
echo Creating manifest file for Steam to run as admin...
|
||||
(
|
||||
echo @echo off
|
||||
echo Check if user is logged on
|
||||
echo query user ^| find /i "%USERNAME%" ^>nul
|
||||
echo if ERRORLEVEL 1 exit
|
||||
echo Set Steam As Admin
|
||||
echo REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%STEAM_PATH%" /f
|
||||
) > "%SCRIPT_PATH1%"
|
||||
echo ^<?xml version="1.0" encoding="UTF-8" standalone="yes"?^>
|
||||
echo ^<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"^>
|
||||
echo ^<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"^>
|
||||
echo ^<security^>
|
||||
echo ^<requestedPrivileges^>
|
||||
echo ^<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/^>
|
||||
echo ^</requestedPrivileges^>
|
||||
echo ^</security^>
|
||||
echo ^</trustInfo^>
|
||||
echo ^</assembly^>
|
||||
) > "%MANIFEST_PATH%"
|
||||
|
||||
:: Create VBScript to run the batch file silently
|
||||
@echo off
|
||||
SET "VBS_NAME1=RunSteamAsAdmin.vbs"
|
||||
SET "VBS_PATH1=%STEAM_FOLDER%\%VBS_NAME1%"
|
||||
echo Set WshShell = CreateObject("WScript.Shell") > "%VBS_PATH1%"
|
||||
echo WshShell.Run chr(34)^&"%SCRIPT_PATH1%"^&chr(34), 0, True >> "%VBS_PATH1%"
|
||||
echo Set WshShell = Nothing >> "%VBS_PATH1%"
|
||||
echo Creating DelayedExplorerStart.bat script
|
||||
|
||||
echo Create the DelayedExplorerStart.bat script in the Steam folder
|
||||
(
|
||||
echo @echo off
|
||||
echo Check if user is logged on
|
||||
echo query user ^| find /i "%USERNAME%" ^>nul
|
||||
echo rem Check if user is logged on
|
||||
echo whoami ^| find /i "%%USERNAME%%" ^>nul
|
||||
echo if ERRORLEVEL 1 exit
|
||||
echo Set Shell back to Explorer
|
||||
echo REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%EXPLORER_PATH%" /f
|
||||
echo rem Set Shell back to Explorer
|
||||
echo REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%%EXPLORER_PATH%%" /f
|
||||
echo timeout /t 20 /nobreak ^>nul
|
||||
echo start C:\Windows\explorer.exe
|
||||
|
||||
echo rem Launch Explorer minimized without stealing focus by using a temporary VBScript
|
||||
echo set "TempVBS=%%TEMP%%\LaunchExplorerMinimized.vbs"
|
||||
echo (echo Set WshShell = CreateObject("WScript.Shell"))>"%%TempVBS%%"
|
||||
echo (echo ' 7 = Minimized & no focus) >>"%%TempVBS%%"
|
||||
echo (echo WshShell.Run "explorer.exe", 7, False)>>"%%TempVBS%%"
|
||||
echo (echo Set WshShell = Nothing)>>"%%TempVBS%%"
|
||||
echo cscript //nologo "%%TempVBS%%"
|
||||
echo del "%%TempVBS%%"
|
||||
|
||||
echo timeout /t 10 /nobreak ^>nul
|
||||
echo REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%STEAM_PATH%" /f
|
||||
echo REG ADD "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%%STEAM_PATH%%" /f
|
||||
) > "%SCRIPT_PATH%"
|
||||
|
||||
|
||||
@@ -120,26 +125,21 @@ echo ^</Task^>
|
||||
) > "%XML_PATH%"
|
||||
|
||||
echo Delete the existing scheduled task if it exists
|
||||
schtasks /delete /tn "RunDelayedExplorerStart" /f
|
||||
schtasks /delete /tn "RunDelayedExplorerStart" /f /ru "%USERNAME%"
|
||||
|
||||
echo Create the scheduled task using the XML file
|
||||
schtasks /create /tn "RunDelayedExplorerStart" /xml "%XML_PATH%"
|
||||
schtasks /create /tn "RunDelayedExplorerStart" /xml "%XML_PATH%" /ru "%USERNAME%"
|
||||
|
||||
echo Delayed Explorer start script and VBScript created in Steam folder.
|
||||
echo Scheduled Task added to run the script at logon.
|
||||
echo XML file for Scheduled Task created.
|
||||
|
||||
echo Enable automatic logon
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 1 /f
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /t REG_SZ /d "%USERNAME%" /f
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /t REG_SZ /d "" /f
|
||||
|
||||
echo Disable the boot UI
|
||||
bcdedit.exe -set {globalsettings} bootuxdisabled on
|
||||
|
||||
echo Disable Logon UI
|
||||
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DisableLogonUI /t REG_DWORD /d 1 /f
|
||||
reg add "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DisableLogonUI /t REG_DWORD /d 1 /f
|
||||
|
||||
echo Disable Visual Effects
|
||||
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v VisualEffects /t REG_DWORD /d 3 /f
|
||||
@@ -161,13 +161,9 @@ reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Mem
|
||||
echo Enabling No GUI Boot
|
||||
bcdedit /set {current} quietboot on
|
||||
|
||||
PowerShell -Command "Enable-WindowsOptionalFeature -Online -FeatureName 'DeviceLockdown' -All"
|
||||
PowerShell -Command "Enable-WindowsOptionalFeature -Online -FeatureName 'Custom Logon' -All"
|
||||
|
||||
echo Registry modifications are complete.
|
||||
echo Steam Big Picture set as default shell.
|
||||
echo Automatic logon enabled.
|
||||
echo Boot UI disabled.
|
||||
|
||||
pause
|
||||
|
@@ -1,192 +0,0 @@
|
||||
@echo off
|
||||
SETLOCAL EnableExtensions
|
||||
|
||||
echo Setting Steam Big Picture as default shell
|
||||
|
||||
echo Set Steam Big Picture as the default shell
|
||||
SET "KEY_NAME=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
|
||||
SET "VALUE_NAME=Shell"
|
||||
SET "STEAM_PATH=C:\Program Files (x86)\Steam\Steam.exe -bigpicture -silent -nobootstrapupdate -skipinitialbootstrap -skipverifyfiles"
|
||||
REG ADD "%KEY_NAME%" /v %VALUE_NAME% /t REG_SZ /d "%STEAM_PATH%" /f
|
||||
|
||||
|
||||
@echo off
|
||||
SETLOCAL EnableExtensions EnableDelayedExpansion
|
||||
|
||||
echo Define the default Steam folder path and script names
|
||||
SET "STEAM_FOLDER=C:\Program Files (x86)\Steam"
|
||||
SET "SCRIPT_NAME=DelayedExplorerStart.bat"
|
||||
SET "SCRIPT_PATH=%STEAM_FOLDER%\%SCRIPT_NAME%"
|
||||
SET "EXPLORER_PATH=C:\Windows\explorer.exe"
|
||||
|
||||
echo Creating DelayedExplorerStart.bat script
|
||||
|
||||
echo Create the DelayedExplorerStart.bat script in the Steam folder
|
||||
(
|
||||
echo @echo off
|
||||
echo Check if user is logged on
|
||||
echo query user ^| find /i "%USERNAME%" ^>nul
|
||||
echo if ERRORLEVEL 1 exit
|
||||
echo Set Shell back to Explorer
|
||||
echo REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%EXPLORER_PATH%" /f
|
||||
echo timeout /t 20 /nobreak ^>nul
|
||||
echo start C:\Windows\explorer.exe
|
||||
echo timeout /t 10 /nobreak ^>nul
|
||||
echo REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "%STEAM_PATH%" /f
|
||||
) > "%SCRIPT_PATH%"
|
||||
|
||||
|
||||
echo %VBS_PATH%
|
||||
|
||||
echo Creating RunBatchSilently.vbs script
|
||||
|
||||
:: Create VBScript to run the batch file silently
|
||||
@echo off
|
||||
SET "VBS_NAME=RunBatchSilently.vbs"
|
||||
SET "VBS_PATH=%STEAM_FOLDER%\%VBS_NAME%"
|
||||
echo Set WshShell = CreateObject("WScript.Shell") > "%VBS_PATH%"
|
||||
echo WshShell.Run chr(34)^&"%SCRIPT_PATH%"^&chr(34), 0, True >> "%VBS_PATH%"
|
||||
echo Set WshShell = Nothing >> "%VBS_PATH%"
|
||||
|
||||
echo Create XML file for the scheduled task
|
||||
SET XML_PATH=%STEAM_FOLDER%\DelayedExplorerStartTask.xml
|
||||
|
||||
echo Delete the existing XML file if it exists
|
||||
IF EXIST "%XML_PATH%" DEL "%XML_PATH%"
|
||||
|
||||
(
|
||||
echo ^<?xml version="1.0" encoding="UTF-16"?^>
|
||||
echo ^<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"^>
|
||||
echo ^<RegistrationInfo^>
|
||||
echo ^<Date^>2020-01-01T00:00:00^</Date^>
|
||||
echo ^<Author^>"%USERNAME%"^</Author^>
|
||||
echo ^<Description^>Run DelayedExplorerStart.bat at logon.^</Description^>
|
||||
echo ^</RegistrationInfo^>
|
||||
echo ^<Triggers^>
|
||||
echo ^<LogonTrigger^>
|
||||
echo ^<Enabled^>true^</Enabled^>
|
||||
echo ^</LogonTrigger^>
|
||||
echo ^</Triggers^>
|
||||
echo ^<Principals^>
|
||||
echo ^<Principal id="Author"^>
|
||||
echo ^<UserId^>%USERNAME%</UserId^>
|
||||
echo ^<LogonType^>InteractiveToken^</LogonType^>
|
||||
echo ^<RunLevel^>HighestAvailable^</RunLevel^>
|
||||
echo ^</Principal^>
|
||||
echo ^</Principals^>
|
||||
echo ^<Settings^>
|
||||
echo ^<MultipleInstancesPolicy^>IgnoreNew^</MultipleInstancesPolicy^>
|
||||
echo ^<DisallowStartIfOnBatteries^>false^</DisallowStartIfOnBatteries^>
|
||||
echo ^<StopIfGoingOnBatteries^>false^</StopIfGoingOnBatteries^>
|
||||
echo ^<AllowHardTerminate^>true^</AllowHardTerminate^>
|
||||
echo ^<StartWhenAvailable^>true^</StartWhenAvailable^>
|
||||
echo ^<RunOnlyIfNetworkAvailable^>false^</RunOnlyIfNetworkAvailable^>
|
||||
echo ^<IdleSettings^>
|
||||
echo ^<StopOnIdleEnd^>true^</StopOnIdleEnd^>
|
||||
echo ^<RestartOnIdle^>false^</RestartOnIdle^>
|
||||
echo ^</IdleSettings^>
|
||||
echo ^<Enabled^>true^</Enabled^>
|
||||
echo ^<Hidden^>false^</Hidden^>
|
||||
echo ^<WakeToRun^>false^</WakeToRun^>
|
||||
echo ^<ExecutionTimeLimit^>PT72H^</ExecutionTimeLimit^>
|
||||
echo ^<Priority^>7^</Priority^>
|
||||
echo ^</Settings^>
|
||||
echo ^<Actions Context="Author"^>
|
||||
echo ^<Exec^>
|
||||
echo ^<Command^>wscript.exe^</Command^>
|
||||
echo ^<Arguments^>"%VBS_PATH%"^</Arguments^>
|
||||
echo ^</Exec^>
|
||||
echo ^</Actions^>
|
||||
echo ^</Task^>
|
||||
) > "%XML_PATH%"
|
||||
|
||||
echo Delete the existing scheduled task if it exists
|
||||
schtasks /delete /tn "RunDelayedExplorerStart" /f
|
||||
|
||||
echo Create the scheduled task using the XML file
|
||||
schtasks /create /tn "RunDelayedExplorerStart" /xml "%XML_PATH%"
|
||||
|
||||
echo Delayed Explorer start script and VBScript created in Steam folder.
|
||||
echo Scheduled Task added to run the script at logon.
|
||||
echo XML file for Scheduled Task created.
|
||||
|
||||
echo Enable automatic logon
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d 1 /f
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /t REG_SZ /d "%USERNAME%" /f
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /t REG_SZ /d "" /f
|
||||
|
||||
echo Disable the boot UI
|
||||
bcdedit.exe -set {globalsettings} bootuxdisabled on
|
||||
|
||||
echo Disable Logon UI
|
||||
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DisableLogonUI /t REG_DWORD /d 1 /f
|
||||
|
||||
echo Disable Visual Effects
|
||||
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v VisualEffects /t REG_DWORD /d 3 /f
|
||||
|
||||
echo Increase File System Performance
|
||||
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /v NtfsDisableLastAccessUpdate /t REG_DWORD /d 1 /f
|
||||
|
||||
@echo off
|
||||
|
||||
REM Disable Fast Startup to ensure changes take effect
|
||||
powercfg -h off
|
||||
|
||||
REM Disable the lock screen (effective for Enterprise/Education)
|
||||
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\Personalization" /v NoLockScreen /t REG_DWORD /d 1 /f
|
||||
|
||||
REM Set the logon background to black by setting a custom background
|
||||
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\System" /v DisableLogonBackgroundImage /t REG_DWORD /d 1 /f
|
||||
|
||||
REM Create the backgrounds folder if it doesn't exist
|
||||
if not exist "C:\Windows\System32\oobe\info\backgrounds" (
|
||||
mkdir "C:\Windows\System32\oobe\info\backgrounds"
|
||||
)
|
||||
|
||||
REM Generate a black image using PowerShell
|
||||
powershell -command "Add-Type -AssemblyName System.Drawing; $width = 1920; $height = 1080; $bitmap = New-Object System.Drawing.Bitmap $width, $height; $graphics = [System.Drawing.Graphics]::FromImage($bitmap); $black = [System.Drawing.Brushes]::Black; $graphics.FillRectangle($black, 0, 0, $width, $height); $bitmap.Save('C:\Windows\System32\oobe\info\backgrounds\backgroundDefault.jpg', [System.Drawing.Imaging.ImageFormat]::Jpeg); $graphics.Dispose(); $bitmap.Dispose();"
|
||||
|
||||
REM Set the custom black background image for the lock screen
|
||||
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\Personalization" /v LockScreenImage /t REG_SZ /d "C:\Windows\System32\oobe\info\backgrounds\backgroundDefault.jpg" /f
|
||||
|
||||
REM Do not display last signed-in user name
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v DontDisplayLastUserName /t REG_DWORD /d 1 /f
|
||||
|
||||
REM Do not display the username and other information during sign-in
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v DontDisplayLockedUserId /t REG_DWORD /d 3 /f
|
||||
|
||||
REM Disable Windows animations during sign-in
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v DisableStatusMessages /t REG_DWORD /d 1 /f
|
||||
|
||||
REM Disable verbose status messages
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v VerboseStatus /t REG_DWORD /d 0 /f
|
||||
|
||||
REM Disable the Welcome screen and reduce animation delay
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v DelayedDesktopSwitchTimeout /t REG_DWORD /d 0 /f
|
||||
|
||||
REM Disable lock screen transitions
|
||||
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\System" /v DisableLockScreenAppNotifications /t REG_DWORD /d 1 /f
|
||||
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\System" /v DisableLogonUIAnimations /t REG_DWORD /d 1 /f
|
||||
|
||||
echo Disable Startup Delay
|
||||
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" /f
|
||||
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" /v StartupDelayInMSec /t REG_DWORD /d 0 /f
|
||||
|
||||
echo Improve Windows Explorer Process Priority
|
||||
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\explorer.exe\PerfOptions" /v CpuPriorityClass /t REG_DWORD /d 3 /f
|
||||
echo Adjust Large System Cache
|
||||
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v LargeSystemCache /t REG_DWORD /d 1 /f
|
||||
echo Enabling No GUI Boot
|
||||
bcdedit /set {current} quietboot on
|
||||
|
||||
PowerShell -Command "Enable-WindowsOptionalFeature -Online -FeatureName 'DeviceLockdown' -All"
|
||||
PowerShell -Command "Enable-WindowsOptionalFeature -Online -FeatureName 'Custom Logon' -All"
|
||||
|
||||
echo Registry modifications are complete.
|
||||
echo Steam Big Picture set as default shell.
|
||||
echo Automatic logon enabled.
|
||||
echo Boot UI disabled.
|
||||
|
||||
pause
|
||||
|
@@ -1,59 +0,0 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
:: Log file
|
||||
set log_file=%~dp0modify_winlogon.log
|
||||
set temp_dir=C:\Temp
|
||||
set vs_install_log=%temp_dir%\vs_buildtools_install.log
|
||||
set vs_install_error_log=%temp_dir%\vs_buildtools_install_error.log
|
||||
|
||||
echo Script started at %date% %time% > %log_file%
|
||||
echo Script started at %date% %time%
|
||||
|
||||
:: Ensure running as administrator
|
||||
openfiles >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo This script must be run as administrator! >> %log_file%
|
||||
echo This script must be run as administrator!
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
|
||||
:: Ensure Temp Directory Exists and has Correct Permissions
|
||||
echo Ensuring temp directory exists and has correct permissions... >> %log_file%
|
||||
if not exist "%temp_dir%" (
|
||||
mkdir "%temp_dir%"
|
||||
)
|
||||
icacls "%temp_dir%" /grant Everyone:(F) >> %log_file% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to set permissions for the temp directory. >> %log_file%
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
echo Temp directory permissions set. >> %log_file%
|
||||
|
||||
:: Download Visual Studio Build Tools Installer
|
||||
set installer=%temp_dir%\vs_buildtools.exe
|
||||
echo Downloading Visual Studio Build Tools... >> %log_file%
|
||||
powershell -Command "Invoke-WebRequest -Uri 'https://aka.ms/vs/16/release/vs_buildtools.exe' -OutFile '%installer%'" >> %log_file% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to download Visual Studio Build Tools installer. >> %log_file%
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
echo Visual Studio Build Tools installer downloaded successfully. >> %log_file%
|
||||
|
||||
:: Run Visual Studio Build Tools Installer
|
||||
echo Running Visual Studio Build Tools installer... >> %log_file%
|
||||
powershell -Command "Start-Process -Wait -FilePath '%installer%' -ArgumentList '--add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --passive --norestart' -RedirectStandardOutput '%vs_install_log%' -RedirectStandardError '%vs_install_error_log%' -NoNewWindow" >> %log_file% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to install Visual Studio Build Tools. >> %log_file%
|
||||
echo Check the install log for details: %vs_install_log% and %vs_install_error_log% >> %log_file%
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
echo Visual Studio Build Tools installed successfully. >> %log_file%
|
||||
|
||||
:: Indicate end of script
|
||||
echo Script completed successfully. >> %log_file%
|
||||
pause
|
20
README.md
20
README.md
@@ -1,11 +1,15 @@
|
||||
Transform your Windows Computer into a Video Game console first, PC second!
|
||||
|
||||
**This script is a WIP. Currently, the main functionality works as intended. Steam Big Picture launches automatically when the OS boots, then explorer starts automatically after a delay, which allows you to exit to desktop via the menu without needing to launch a shortcut for Explorer.exe first.**
|
||||
**This script is a WIP. Currently, the main functionality works as intended. Steam Big Picture (or Playnite) launches automatically when the OS boots with high priority set as as the shell, then explorer starts automatically after a delay, which allows you to exit to desktop via the menu without needing to launch a shortcut for Explorer.exe first.**
|
||||
|
||||
**Note: Steam or Playnite must be installed, you must be signed in to Steam if using the Steam variant, and finally the Steam Autostart entry in task manager must be disabled/deleted before running the script.**
|
||||
|
||||
**This script must be run as admin!**
|
||||
|
||||
# GamesDows
|
||||
The Enable GamesDows batch script makes Windows boot straight into Steam Big Picture without displaying any Explorer UI elements to ensure a Game Console like experience on Windows. I made this because I have a Steam Deck and I want the experience to mirror that of Steam OS as closely as possible. However, this will work on any Windows PC, the commands are not specific to the Steam Deck.
|
||||
The Enable GamesDows batch script makes Windows boot straight into Steam Big Picture or Playnite without displaying any Explorer UI elements to ensure a Game Console like experience on Windows. I made this because I have a Steam Deck and I want the experience to mirror that of Steam OS as closely as possible. However, this will work on any Windows PC, the commands are not specific to the Steam Deck.
|
||||
|
||||
**How the main functionality works: The enable Game Mode batch script sets steam big picture as the shell > batch launches steam as lower privileged (so the virtual mouse and keyboard don't work on system prompts such as task manager yet, it needs to run as admin to fix that. One of the 4 remaining problems) The enable Game Mode batch script creates a VBS script to suppress the command prompt window set as the shell at boot > The VBS script launches a second batch script created by the enable script run as admin > The second batch script is run by a scheduled task after a 20 second delay > delayed explorer batch script resets the shell to to explorer.exe, then launches explorer in the background so that it's possible to exit big picture without running a shortcut (menu performs as expected and exits directly to desktop).**
|
||||
**How the main functionality works: The enable Game Mode batch script sets steam big picture as the shell and creates a manifest file in the Steam folder which allows it to always start as admin. The enable Game Mode batch script creates a VBS script to suppress the command prompt window when Explorer.exe launches in the background > The VBS script launches a second batch script created by the enable script creates and launches the second batch script via a scheduled task after a 20 second delay > delayed explorer batch script resets the shell to to explorer.exe, then launches explorer in the background so that it's possible to exit big picture without running a shortcut (menu performs as expected and exits directly to desktop without manually launching a separate shortcut).**
|
||||
|
||||
After another delay once explorer.exe is started (it retains elevated permissions once started), the default shell is reset to Steam Big Picture so that it boots directly to Big Picture as expected upon reboot.
|
||||
|
||||
@@ -56,12 +60,12 @@ What remains to be fixed:
|
||||
|
||||
1. Completely suppressing the taskbar from appearing when Windows Explorer automatically launches in the background. The taskbar displays temporarily for ~1 second when explorer.exe launches, which makes it appear over the Big Picture UI; and then it disappears. This is not intended behavior, and it is visually distracting.
|
||||
|
||||
2. Disabling the Windows welcome sign-in UI animation (user picture, user name, spinning wheel) entirely. Currently the Boot logo is removed as intended, and the script is set to log the user account which ran the script in automatically. The welcome sign-in animation still remains, and will be disabled in future versions of the script. Going to have to write a custom C++ application to do so since there is no off the shelf way to disable the Welcome Screen on Windows 11.
|
||||
2. Disabling the Windows welcome sign-in UI animation (user picture, user name, spinning wheel) entirely. Currently the Boot logo is removed as intended, and the script is set to log the user account which ran the script in automatically. The welcome sign-in animation still remains, and will be disabled in future versions of the script. Going to have to write a custom C++ application or a custom credential provider to do so since there is no off the shelf way to disable the Welcome Screen on Windows 11.
|
||||
|
||||
3. Setting Steam to start as admin (VBS script to suppress the command prompt window set as the shell at boot > VBS script launches the batch script > batch sets steam big picture as the shell > batch launches steam as admin > delayed explorer batch script resets the shell to the VBS script so Steam launches as the default shell at boot.)
|
||||
|
||||
4. Disabling the Steam client update window which displays momentarily when Steam updates (this only occurs when the Steam Client has an update, otherwise it will not appear) before launching Big Picture.
|
||||
3. Disabling the Steam client update window which displays momentarily when Steam updates (this only occurs when the Steam Client has an update, otherwise it will not appear) before launching Big Picture.
|
||||
|
||||
**Please let me know if you have any issues with existing functionality and I'll try to get the bugs fixed up if any arise.**
|
||||
|
||||
I will gladly take PRs to fix the 4 remaining issues if anyone knows how to solve them.
|
||||
I will gladly take PRs to fix the 3 remaining issues if anyone knows how to solve them.
|
||||
|
||||
**Note: If for any reason explorer doesn't start and you get a black screen and cannot view the desktop, it needs to be launched manually via task manager by launching explorer.exe. It needs to be set as the shell first before it is launched from task manager for the desktop to appear when launched a single time, otherwise it will just launch a file browser window. Due to this limitation, you must start explorer.exe twice from task manager to load the Desktop**
|
||||
|
1
Set explorer as shell.reg
Normal file
1
Set explorer as shell.reg
Normal file
@@ -0,0 +1 @@
|
||||
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Shell /t REG_SZ /d "C:\Windows\explorer.exe" /f
|
@@ -1,222 +0,0 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
:: Log file
|
||||
set log_file=%~dp0modify_winlogon.log
|
||||
set compile_log=%~dp0compile.log
|
||||
|
||||
echo Script started at %date% %time% > %log_file%
|
||||
|
||||
:: Ensure running as administrator
|
||||
openfiles >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo This script must be run as administrator! >> %log_file%
|
||||
echo This script must be run as administrator!
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
|
||||
:: Paths and filenames
|
||||
set exe_name=CustomLogonUI.exe
|
||||
set cpp_code=CustomLogonUI.cpp
|
||||
set src_path=%~dp0
|
||||
set log_file=%~dp0modify_winlogon.log
|
||||
set dst_path=C:\Windows\System32
|
||||
set backup_logonui=logonui_backup.exe
|
||||
set temp_dir=C:\Temp
|
||||
set installer=%temp_dir%\vs_buildtools.exe
|
||||
set vs_install_log=%temp_dir%\vs_buildtools_install.log
|
||||
set vs_install_error_log=%temp_dir%\vs_buildtools_install_error.log
|
||||
echo Script started at %date% %time% > %log_file%
|
||||
echo Script started at %date% %time%
|
||||
|
||||
:: Ensure Temp Directory Exists and has Correct Permissions
|
||||
echo Ensuring temp directory exists and has correct permissions... >> %log_file%
|
||||
if not exist "%temp_dir%" (
|
||||
mkdir "%temp_dir%"
|
||||
)
|
||||
icacls "%temp_dir%" /grant Everyone:(F) >> %log_file% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to set permissions for the temp directory. >> %log_file%
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
echo Temp directory permissions set. >> %log_file%
|
||||
|
||||
:: Step 2: Install .NET Framework 4.8 (NetFx4-AdvSrvs)
|
||||
echo Installing .NET Framework 4.8 (NetFx4-AdvSrvs)... >> %log_file%
|
||||
echo Installing .NET Framework 4.8 (NetFx4-AdvSrvs)...
|
||||
dism /online /enable-feature /featurename:NetFx4-AdvSrvs /All /NoRestart >> %log_file% 2>&1
|
||||
echo DISM command exit code: %errorlevel% >> %log_file%
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to install .NET Framework 4.8 (NetFx4-AdvSrvs). >> %log_file%
|
||||
echo Failed to install .NET Framework 4.8 (NetFx4-AdvSrvs). Check the log for details: %log_file%
|
||||
exit /b
|
||||
)
|
||||
echo .NET Framework 4.8 (NetFx4-AdvSrvs) installed successfully. >> %log_file%
|
||||
echo .NET Framework 4.8 (NetFx4-AdvSrvs) installed successfully.
|
||||
|
||||
:: Step 4: Install Windows SDK
|
||||
echo Downloading Windows SDK... >> %log_file%
|
||||
echo Downloading Windows SDK...
|
||||
powershell -command "Invoke-WebRequest -Uri 'https://go.microsoft.com/fwlink/?linkid=2120843' -OutFile '%sdk_installer%'" >> %log_file% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to download Windows SDK installer. >> %log_file%
|
||||
echo Failed to download Windows SDK installer.
|
||||
exit /b
|
||||
)
|
||||
echo Windows SDK installer downloaded successfully. >> %log_file%
|
||||
echo Windows SDK installer downloaded successfully.
|
||||
|
||||
echo Installing Windows SDK... >> %log_file%
|
||||
echo Installing Windows SDK...
|
||||
start /wait "" "%sdk_installer%" /Quiet /NoRestart /Features + /InstallPath "%ProgramFiles%\Windows Kits\10" >> %log_file% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to install Windows SDK. >> %log_file%
|
||||
echo Failed to install Windows SDK.
|
||||
exit /b
|
||||
)
|
||||
echo Windows SDK installed successfully. >> %log_file%
|
||||
echo Windows SDK installed successfully.
|
||||
|
||||
@echo off
|
||||
|
||||
:: Install Visual C++ Redist
|
||||
echo Downloading Visual C++ Redistributable installers...
|
||||
|
||||
:: Create a temporary directory to store the installers
|
||||
set "TMP_DIR=%TEMP%\vcredist_installers"
|
||||
mkdir "%TMP_DIR%"
|
||||
|
||||
:: Download the latest Visual C++ Redistributable installers
|
||||
bitsadmin /transfer "VC2015-2022 x64" https://aka.ms/vs/17/release/vc_redist.x64.exe "%TMP_DIR%\VC_redist.x64.exe"
|
||||
bitsadmin /transfer "VC2015-2022 x86" https://aka.ms/vs/17/release/vc_redist.x86.exe "%TMP_DIR%\VC_redist.x86.exe"
|
||||
|
||||
echo Installing Visual C++ Redistributable packages...
|
||||
|
||||
:: Install Visual C++ 2015-2022 Redistributable
|
||||
start /wait "%TMP_DIR%\VC_redist.x64.exe" /install /quiet /norestart
|
||||
start /wait "%TMP_DIR%\VC_redist.x86.exe" /install /quiet /norestart
|
||||
|
||||
echo Visual C++ Redistributable packages installed successfully!
|
||||
|
||||
:: Clean up the temporary directory
|
||||
rmdir /s /q "%TMP_DIR%"
|
||||
|
||||
pause
|
||||
|
||||
:: Step 6: Download and Install Visual Studio Community Edition
|
||||
echo Downloading Visual Studio Community Edition... >> %log_file%
|
||||
echo Downloading Visual Studio Community Edition...
|
||||
powershell -command "Invoke-WebRequest -Uri 'https://aka.ms/vs/16/release/vs_community.exe' -OutFile '%vs_community_installer%'" >> %log_file% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to download Visual Studio Community installer. >> %log_file%
|
||||
echo Failed to download Visual Studio Community installer.
|
||||
exit /b
|
||||
)
|
||||
echo Visual Studio Community installer downloaded successfully. >> %log_file%
|
||||
echo Visual Studio Community installer downloaded successfully.
|
||||
|
||||
echo Installing Visual Studio Community Edition... >> %log_file%
|
||||
echo Installing Visual Studio Community Edition...
|
||||
start /wait "" "%vs_community_installer%" --add Microsoft.VisualStudio.Workload.CoreEditor --includeRecommended --passive --norestart --log %vs_install_log% --loglevel verbose
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to install Visual Studio Community. Check the install log for details: %vs_install_log% >> %log_file%
|
||||
echo Failed to install Visual Studio Community. Check the install log for details: %vs_install_log%
|
||||
exit /b
|
||||
)
|
||||
echo Visual Studio Community installed successfully. >> %log_file%
|
||||
echo Visual Studio Community installed successfully.
|
||||
|
||||
:: Download Visual Studio Build Tools Installer
|
||||
set installer=%temp_dir%\vs_buildtools.exe
|
||||
echo Downloading Visual Studio Build Tools... >> %log_file%
|
||||
powershell -Command "Invoke-WebRequest -Uri 'https://aka.ms/vs/16/release/vs_buildtools.exe' -OutFile '%installer%'" >> %log_file% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to download Visual Studio Build Tools installer. >> %log_file%
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
echo Visual Studio Build Tools installer downloaded successfully. >> %log_file%
|
||||
|
||||
:: Run Visual Studio Build Tools Installer
|
||||
echo Running Visual Studio Build Tools installer... >> %log_file%
|
||||
powershell -Command "Start-Process -Wait -FilePath '%installer%' -ArgumentList '--add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --passive --norestart' -RedirectStandardOutput '%vs_install_log%' -RedirectStandardError '%vs_install_error_log%' -NoNewWindow" >> %log_file% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to install Visual Studio Build Tools. >> %log_file%
|
||||
echo Check the install log for details: %vs_install_log% and %vs_install_error_log% >> %log_file%
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
echo Visual Studio Build Tools installed successfully. >> %log_file%
|
||||
|
||||
:: Indicate end of script
|
||||
echo Script completed successfully. >> %log_file%
|
||||
pause
|
||||
|
||||
:: Step 5: Create the C++ source file using PowerShell
|
||||
echo Creating C++ source file using PowerShell... >> %log_file%
|
||||
powershell -command "Add-Content -Path '%cpp_code%' -Value '#include <windows.h>'; Add-Content -Path '%cpp_code%' -Value 'int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)'; Add-Content -Path '%cpp_code%' -Value '{'; Add-Content -Path '%cpp_code%' -Value ' return 0;'; Add-Content -Path '%cpp_code%' -Value '}';"
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to create the C++ source file using PowerShell. >> %log_file%
|
||||
echo Failed to create the C++ source file using PowerShell.
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
echo C++ source file created successfully using PowerShell. >> %log_file%
|
||||
|
||||
:: Step 6: Compile the C++ code to create the custom executable
|
||||
echo Compiling the C++ source file... >> %log_file%
|
||||
call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x86 >> %log_file% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to set up Visual Studio environment. >> %log_file%
|
||||
echo Failed to set up Visual Studio environment.
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
cl %cpp_code% /Fe:%exe_name% /link /SUBSYSTEM:WINDOWS > %compile_log% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Compilation failed. >> %log_file%
|
||||
echo Compilation failed. Check the compile.log for details. >> %log_file%
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
echo C++ source file compiled successfully. >> %log_file%
|
||||
|
||||
:: Step 7: Ensure the custom executable was created
|
||||
if not exist "%src_path%%exe_name%" (
|
||||
echo Custom executable %exe_name% not found in %src_path%. >> %log_file%
|
||||
echo Custom executable %exe_name% not found in %src_path%.
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
echo Custom executable found. >> %log_file%
|
||||
pause
|
||||
|
||||
:: Step 8: Backup the original logonui.exe
|
||||
echo Backing up the original logonui.exe... >> %log_file%
|
||||
copy "%dst_path%\logonui.exe" "%dst_path%\%backup_logonui%" >> %log_file% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to backup the original logonui.exe. >> %log_file%
|
||||
echo Failed to backup the original logonui.exe.
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
echo Original logonui.exe backed up successfully. >> %log_file%
|
||||
pause
|
||||
|
||||
:: Step 9: Replace the original logonui.exe with the custom executable
|
||||
echo Replacing the original logonui.exe with the custom executable... >> %log_file%
|
||||
copy "%src_path%%exe_name%" "%dst_path%\logonui.exe" >> %log_file% 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo Failed to replace logonui.exe. >> %log_file%
|
||||
echo Failed to replace logonui.exe.
|
||||
pause
|
||||
exit /b
|
||||
)
|
||||
echo logonui.exe replaced successfully. >> %log_file%
|
||||
pause
|
||||
|
||||
echo All changes applied successfully. Please restart your computer. >> %log_file%
|
||||
echo All changes applied successfully. Please restart your computer.
|
||||
pause
|
830
decky_builder.py
Normal file
830
decky_builder.py
Normal file
@@ -0,0 +1,830 @@
|
||||
import os
|
||||
import subprocess
|
||||
import shutil
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
import sys
|
||||
import time
|
||||
import PyInstaller
|
||||
import atexit
|
||||
import requests
|
||||
import psutil
|
||||
import re
|
||||
|
||||
class DeckyBuilder:
|
||||
def __init__(self, release: str = None):
|
||||
self.release = release or self.prompt_for_version()
|
||||
self.root_dir = Path(__file__).resolve().parent
|
||||
self.app_dir = self.root_dir / "app"
|
||||
self.src_dir = self.root_dir / "src"
|
||||
self.dist_dir = self.root_dir / "dist"
|
||||
self.homebrew_dir = self.dist_dir / "homebrew"
|
||||
self.temp_files = [] # Track temporary files for cleanup
|
||||
atexit.register(self.cleanup) # Register cleanup on exit
|
||||
|
||||
# Setup user homebrew directory
|
||||
self.user_home = Path.home()
|
||||
self.user_homebrew_dir = self.user_home / "homebrew"
|
||||
self.homebrew_folders = [
|
||||
"data",
|
||||
"logs",
|
||||
"plugins",
|
||||
"services",
|
||||
"settings",
|
||||
"themes"
|
||||
]
|
||||
|
||||
def cleanup(self):
|
||||
"""Clean up temporary files and directories"""
|
||||
try:
|
||||
# Clean up any temporary files we created
|
||||
for temp_file in self.temp_files:
|
||||
if os.path.exists(temp_file):
|
||||
try:
|
||||
if os.path.isfile(temp_file):
|
||||
os.remove(temp_file)
|
||||
elif os.path.isdir(temp_file):
|
||||
shutil.rmtree(temp_file, ignore_errors=True)
|
||||
except Exception as e:
|
||||
print(f"Warning: Failed to remove temporary file {temp_file}: {e}")
|
||||
|
||||
# Clean up PyInstaller temp files
|
||||
for dir_name in ['build', 'dist']:
|
||||
dir_path = self.root_dir / dir_name
|
||||
if dir_path.exists():
|
||||
try:
|
||||
shutil.rmtree(dir_path, ignore_errors=True)
|
||||
except Exception as e:
|
||||
print(f"Warning: Failed to remove {dir_name} directory: {e}")
|
||||
|
||||
# Clean up PyInstaller spec files
|
||||
for spec_file in self.root_dir.glob("*.spec"):
|
||||
try:
|
||||
os.remove(spec_file)
|
||||
except Exception as e:
|
||||
print(f"Warning: Failed to remove spec file {spec_file}: {e}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Warning: Error during cleanup: {e}")
|
||||
|
||||
def safe_remove_directory(self, path):
|
||||
"""Safely remove a directory with retries for Windows"""
|
||||
max_retries = 3
|
||||
retry_delay = 1 # seconds
|
||||
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
if path.exists():
|
||||
# On Windows, sometimes we need to remove .git directory separately
|
||||
git_dir = path / '.git'
|
||||
if git_dir.exists():
|
||||
for item in git_dir.glob('**/*'):
|
||||
if item.is_file():
|
||||
try:
|
||||
item.chmod(0o777) # Give full permissions
|
||||
item.unlink()
|
||||
except:
|
||||
pass
|
||||
|
||||
shutil.rmtree(path, ignore_errors=True)
|
||||
return
|
||||
except Exception as e:
|
||||
print(f"Attempt {attempt + 1} failed to remove {path}: {str(e)}")
|
||||
if attempt < max_retries - 1:
|
||||
time.sleep(retry_delay)
|
||||
continue
|
||||
else:
|
||||
print(f"Warning: Could not fully remove {path}. Continuing anyway...")
|
||||
|
||||
def setup_directories(self):
|
||||
"""Setup directory structure"""
|
||||
print("Setting up directories...")
|
||||
# Clean up any existing directories
|
||||
if self.app_dir.exists():
|
||||
self.safe_remove_directory(self.app_dir)
|
||||
if self.src_dir.exists():
|
||||
self.safe_remove_directory(self.src_dir)
|
||||
if self.homebrew_dir.exists():
|
||||
self.safe_remove_directory(self.homebrew_dir)
|
||||
|
||||
# Create fresh directories
|
||||
self.src_dir.mkdir(parents=True, exist_ok=True)
|
||||
self.homebrew_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
def setup_homebrew(self):
|
||||
"""Setup homebrew directory structure"""
|
||||
print("Setting up homebrew directory structure...")
|
||||
# Create dist directory
|
||||
(self.homebrew_dir / "dist").mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Setup homebrew directory structure for both temp and user directories
|
||||
print("Setting up homebrew directory structure...")
|
||||
for directory in [self.homebrew_dir, self.user_homebrew_dir]:
|
||||
if not directory.exists():
|
||||
directory.mkdir(parents=True)
|
||||
|
||||
for folder in self.homebrew_folders:
|
||||
folder_path = directory / folder
|
||||
if not folder_path.exists():
|
||||
folder_path.mkdir(parents=True)
|
||||
|
||||
def clone_repository(self):
|
||||
"""Clone Decky Loader repository and checkout specific version"""
|
||||
print(f"\nCloning Decky Loader repository version: {self.release}")
|
||||
|
||||
# Clean up existing directory
|
||||
if os.path.exists(self.app_dir):
|
||||
print("Removing existing repository...")
|
||||
self.safe_remove_directory(self.app_dir)
|
||||
|
||||
try:
|
||||
# Clone the repository
|
||||
subprocess.run([
|
||||
'git', 'clone', '--no-checkout', # Don't checkout anything yet
|
||||
'https://github.com/SteamDeckHomebrew/decky-loader.git',
|
||||
str(self.app_dir)
|
||||
], check=True)
|
||||
|
||||
os.chdir(self.app_dir)
|
||||
|
||||
# Fetch all refs
|
||||
subprocess.run(['git', 'fetch', '--all', '--tags'], check=True)
|
||||
|
||||
# Try to checkout the exact version first
|
||||
try:
|
||||
subprocess.run(['git', 'checkout', self.release], check=True)
|
||||
except subprocess.CalledProcessError:
|
||||
# If exact version fails, try to find the commit for pre-releases
|
||||
if '-pre' in self.release:
|
||||
# Get all tags and their commit hashes
|
||||
result = subprocess.run(
|
||||
['git', 'ls-remote', '--tags', 'origin'],
|
||||
capture_output=True, text=True, check=True
|
||||
)
|
||||
|
||||
# Find the commit hash for our version
|
||||
for line in result.stdout.splitlines():
|
||||
commit_hash, ref = line.split('\t')
|
||||
ref = ref.replace('refs/tags/', '')
|
||||
ref = ref.replace('^{}', '') # Remove annotated tag suffix
|
||||
if ref == self.release:
|
||||
print(f"Found commit {commit_hash} for version {self.release}")
|
||||
subprocess.run(['git', 'checkout', commit_hash], check=True)
|
||||
break
|
||||
else:
|
||||
raise Exception(f"Could not find commit for version {self.release}")
|
||||
else:
|
||||
raise
|
||||
|
||||
print(f"Successfully checked out version: {self.release}")
|
||||
|
||||
# Create version files in key locations with the requested version
|
||||
version_files = [
|
||||
'.loader.version',
|
||||
'frontend/.loader.version',
|
||||
'backend/.loader.version',
|
||||
'backend/decky_loader/.loader.version'
|
||||
]
|
||||
|
||||
for version_file in version_files:
|
||||
file_path = os.path.join(self.app_dir, version_file)
|
||||
os.makedirs(os.path.dirname(file_path), exist_ok=True)
|
||||
with open(file_path, 'w') as f:
|
||||
f.write(self.release) # Use the requested version
|
||||
|
||||
except subprocess.CalledProcessError as e:
|
||||
raise Exception(f"Failed to clone/checkout repository: {str(e)}")
|
||||
finally:
|
||||
os.chdir(self.root_dir)
|
||||
|
||||
def build_frontend(self):
|
||||
"""Build frontend files"""
|
||||
print("Building frontend...")
|
||||
batch_file = None
|
||||
original_dir = os.getcwd()
|
||||
|
||||
try:
|
||||
frontend_dir = self.app_dir / "frontend"
|
||||
if not frontend_dir.exists():
|
||||
raise Exception(f"Frontend directory not found at {frontend_dir}")
|
||||
|
||||
print(f"Changing to frontend directory: {frontend_dir}")
|
||||
os.chdir(frontend_dir)
|
||||
|
||||
# Create .loader.version file with the release tag
|
||||
version_file = frontend_dir / ".loader.version"
|
||||
with open(version_file, "w") as f:
|
||||
f.write(self.release)
|
||||
self.temp_files.append(str(version_file))
|
||||
|
||||
# Create a batch file to run the commands
|
||||
batch_file = frontend_dir / "build_frontend.bat"
|
||||
with open(batch_file, "w") as f:
|
||||
f.write("@echo off\n")
|
||||
f.write("call pnpm install\n")
|
||||
f.write("if %errorlevel% neq 0 exit /b %errorlevel%\n")
|
||||
f.write("call pnpm run build\n")
|
||||
f.write("if %errorlevel% neq 0 exit /b %errorlevel%\n")
|
||||
self.temp_files.append(str(batch_file))
|
||||
|
||||
print("Running build commands...")
|
||||
result = subprocess.run([str(batch_file)], check=True, capture_output=True, text=True, shell=True)
|
||||
print(result.stdout)
|
||||
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Command failed: {e.cmd}")
|
||||
print(f"Output: {e.output}")
|
||||
print(f"Error: {e.stderr}")
|
||||
raise Exception(f"Error building frontend: Command failed - {str(e)}")
|
||||
except Exception as e:
|
||||
print(f"Error building frontend: {str(e)}")
|
||||
raise
|
||||
finally:
|
||||
# Always return to original directory
|
||||
os.chdir(original_dir)
|
||||
|
||||
def prepare_backend(self):
|
||||
"""Prepare backend files for building."""
|
||||
print("Preparing backend files...")
|
||||
print("Copying files according to Dockerfile structure...")
|
||||
|
||||
# Create src directory if it doesn't exist
|
||||
os.makedirs(self.src_dir, exist_ok=True)
|
||||
|
||||
# Copy backend files from app/backend/decky_loader to src/decky_loader
|
||||
print("Copying backend files...")
|
||||
shutil.copytree(os.path.join(self.app_dir, "backend", "decky_loader"),
|
||||
os.path.join(self.src_dir, "decky_loader"),
|
||||
dirs_exist_ok=True)
|
||||
|
||||
# Copy static, locales, and plugin directories to maintain decky_loader structure
|
||||
os.makedirs(os.path.join(self.src_dir, "decky_loader"), exist_ok=True)
|
||||
shutil.copytree(os.path.join(self.app_dir, "backend", "decky_loader", "static"),
|
||||
os.path.join(self.src_dir, "decky_loader", "static"),
|
||||
dirs_exist_ok=True)
|
||||
shutil.copytree(os.path.join(self.app_dir, "backend", "decky_loader", "locales"),
|
||||
os.path.join(self.src_dir, "decky_loader", "locales"),
|
||||
dirs_exist_ok=True)
|
||||
shutil.copytree(os.path.join(self.app_dir, "backend", "decky_loader", "plugin"),
|
||||
os.path.join(self.src_dir, "decky_loader", "plugin"),
|
||||
dirs_exist_ok=True)
|
||||
|
||||
# Create legacy directory
|
||||
os.makedirs(os.path.join(self.src_dir, "src", "legacy"), exist_ok=True)
|
||||
|
||||
# Copy main.py to src directory
|
||||
shutil.copy2(os.path.join(self.app_dir, "backend", "main.py"),
|
||||
os.path.join(self.src_dir, "main.py"))
|
||||
|
||||
# Create version file in the src directory
|
||||
version_file = os.path.join(self.src_dir, ".loader.version")
|
||||
with open(version_file, "w") as f:
|
||||
f.write(self.release)
|
||||
|
||||
print("Backend preparation completed successfully!")
|
||||
return True
|
||||
|
||||
def install_requirements(self):
|
||||
"""Install Python requirements"""
|
||||
print("Installing Python requirements...")
|
||||
try:
|
||||
# Try both requirements.txt and pyproject.toml
|
||||
requirements_file = self.app_dir / "backend" / "requirements.txt"
|
||||
pyproject_file = self.app_dir / "backend" / "pyproject.toml"
|
||||
|
||||
if requirements_file.exists():
|
||||
subprocess.run([
|
||||
sys.executable, "-m", "pip", "install", "--user", "-r", str(requirements_file)
|
||||
], check=True)
|
||||
elif pyproject_file.exists():
|
||||
# Install core dependencies directly instead of using poetry
|
||||
dependencies = [
|
||||
"aiohttp>=3.8.1",
|
||||
"psutil>=5.9.0",
|
||||
"fastapi>=0.78.0",
|
||||
"uvicorn>=0.17.6",
|
||||
"python-multipart>=0.0.5",
|
||||
"watchdog>=2.1.7",
|
||||
"requests>=2.27.1",
|
||||
"setuptools>=60.0.0",
|
||||
"wheel>=0.37.1",
|
||||
"winregistry>=1.1.1; platform_system == 'Windows'",
|
||||
"pywin32>=303; platform_system == 'Windows'"
|
||||
]
|
||||
|
||||
# Install each dependency
|
||||
for dep in dependencies:
|
||||
try:
|
||||
subprocess.run([
|
||||
sys.executable, "-m", "pip", "install", "--user", dep
|
||||
], check=True)
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Warning: Failed to install {dep}: {str(e)}")
|
||||
continue
|
||||
else:
|
||||
print("Warning: No requirements.txt or pyproject.toml found")
|
||||
except Exception as e:
|
||||
print(f"Error installing requirements: {str(e)}")
|
||||
raise
|
||||
|
||||
def add_defender_exclusion(self, path):
|
||||
"""Add Windows Defender exclusion for a path"""
|
||||
try:
|
||||
subprocess.run([
|
||||
"powershell",
|
||||
"-Command",
|
||||
f"Add-MpPreference -ExclusionPath '{path}'"
|
||||
], check=True, capture_output=True)
|
||||
return True
|
||||
except:
|
||||
print("Warning: Could not add Windows Defender exclusion. You may need to run as administrator or manually add an exclusion.")
|
||||
return False
|
||||
|
||||
def remove_defender_exclusion(self, path):
|
||||
"""Remove Windows Defender exclusion for a path"""
|
||||
try:
|
||||
subprocess.run([
|
||||
"powershell",
|
||||
"-Command",
|
||||
f"Remove-MpPreference -ExclusionPath '{path}'"
|
||||
], check=True, capture_output=True)
|
||||
except:
|
||||
print("Warning: Could not remove Windows Defender exclusion.")
|
||||
|
||||
def build_executables(self):
|
||||
"""Build executables using PyInstaller"""
|
||||
print("\nBuilding executables...")
|
||||
|
||||
# Read version from .loader.version
|
||||
version_file = os.path.join(self.app_dir, '.loader.version')
|
||||
if not os.path.exists(version_file):
|
||||
raise Exception("Version file not found. Run clone_repository first.")
|
||||
|
||||
with open(version_file, 'r') as f:
|
||||
version = f.read().strip()
|
||||
|
||||
# Normalize version for Python packaging
|
||||
# Convert v3.0.5-pre1 to 3.0.5rc1
|
||||
py_version = version.lstrip('v') # Remove v prefix
|
||||
if '-pre' in py_version:
|
||||
py_version = py_version.replace('-pre', 'rc')
|
||||
|
||||
print(f"Building version: {version} (Python package version: {py_version})")
|
||||
|
||||
original_dir = os.getcwd()
|
||||
backend_dir = os.path.join(self.app_dir, "backend")
|
||||
dist_dir = os.path.join(backend_dir, "dist")
|
||||
|
||||
# Add Windows Defender exclusion for build directories
|
||||
added_exclusion = self.add_defender_exclusion(backend_dir)
|
||||
|
||||
try:
|
||||
os.chdir(backend_dir)
|
||||
|
||||
# Create setup.py with the correct version
|
||||
setup_py = """
|
||||
from setuptools import setup, find_packages
|
||||
|
||||
setup(
|
||||
name="decky_loader",
|
||||
version="%s",
|
||||
packages=find_packages(),
|
||||
package_data={
|
||||
'decky_loader': [
|
||||
'locales/*',
|
||||
'static/*',
|
||||
'.loader.version'
|
||||
],
|
||||
},
|
||||
install_requires=[
|
||||
'aiohttp>=3.8.1',
|
||||
'certifi>=2022.6.15',
|
||||
'packaging>=21.3',
|
||||
'psutil>=5.9.1',
|
||||
'requests>=2.28.1',
|
||||
],
|
||||
)
|
||||
""" % py_version
|
||||
|
||||
with open("setup.py", "w") as f:
|
||||
f.write(setup_py)
|
||||
|
||||
# Install the package in development mode
|
||||
subprocess.run([sys.executable, "-m", "pip", "install", "-e", "."], check=True)
|
||||
|
||||
# Common PyInstaller arguments
|
||||
pyinstaller_args = [
|
||||
sys.executable,
|
||||
"-m",
|
||||
"PyInstaller",
|
||||
"--clean",
|
||||
"--noconfirm",
|
||||
"pyinstaller.spec"
|
||||
]
|
||||
|
||||
# First build console version
|
||||
print("Building PluginLoader.exe (console version)...")
|
||||
os.environ.pop('DECKY_NOCONSOLE', None) # Ensure env var is not set
|
||||
subprocess.run(pyinstaller_args, check=True)
|
||||
|
||||
# Then build no-console version
|
||||
print("Building PluginLoader_noconsole.exe...")
|
||||
os.environ['DECKY_NOCONSOLE'] = '1'
|
||||
subprocess.run(pyinstaller_args, check=True)
|
||||
|
||||
# Clean up environment
|
||||
os.environ.pop('DECKY_NOCONSOLE', None)
|
||||
|
||||
# Copy the built executables to dist
|
||||
os.makedirs(os.path.join(self.root_dir, "dist"), exist_ok=True)
|
||||
if os.path.exists(os.path.join("dist", "PluginLoader.exe")):
|
||||
shutil.copy2(
|
||||
os.path.join("dist", "PluginLoader.exe"),
|
||||
os.path.join(self.root_dir, "dist", "PluginLoader.exe")
|
||||
)
|
||||
else:
|
||||
raise Exception("PluginLoader.exe not found after build")
|
||||
|
||||
if os.path.exists(os.path.join("dist", "PluginLoader_noconsole.exe")):
|
||||
shutil.copy2(
|
||||
os.path.join("dist", "PluginLoader_noconsole.exe"),
|
||||
os.path.join(self.root_dir, "dist", "PluginLoader_noconsole.exe")
|
||||
)
|
||||
else:
|
||||
raise Exception("PluginLoader_noconsole.exe not found after build")
|
||||
|
||||
print("Successfully built executables")
|
||||
|
||||
except subprocess.CalledProcessError as e:
|
||||
raise Exception(f"Failed to build executables: {str(e)}")
|
||||
finally:
|
||||
if added_exclusion:
|
||||
self.remove_defender_exclusion(backend_dir)
|
||||
os.chdir(original_dir)
|
||||
|
||||
def install_files(self):
|
||||
"""Install files to homebrew directory"""
|
||||
print("\nInstalling files to homebrew directory...")
|
||||
|
||||
# Create homebrew directory if it doesn't exist
|
||||
homebrew_dir = os.path.join(os.path.expanduser("~"), "homebrew")
|
||||
services_dir = os.path.join(homebrew_dir, "services")
|
||||
os.makedirs(services_dir, exist_ok=True)
|
||||
|
||||
try:
|
||||
# Copy PluginLoader.exe and PluginLoader_noconsole.exe
|
||||
for exe_name in ["PluginLoader.exe", "PluginLoader_noconsole.exe"]:
|
||||
exe_source = os.path.join(self.root_dir, "dist", exe_name)
|
||||
exe_dest = os.path.join(services_dir, exe_name)
|
||||
if not os.path.exists(exe_source):
|
||||
raise Exception(f"{exe_name} not found at {exe_source}")
|
||||
shutil.copy2(exe_source, exe_dest)
|
||||
|
||||
# Create .loader.version file
|
||||
version_file = os.path.join(services_dir, ".loader.version")
|
||||
with open(version_file, "w") as f:
|
||||
f.write(self.release)
|
||||
|
||||
print("Successfully installed files")
|
||||
|
||||
except Exception as e:
|
||||
raise Exception(f"Failed to copy files to homebrew: {str(e)}")
|
||||
|
||||
def install_nodejs(self):
|
||||
"""Install Node.js v18.18.0 with npm"""
|
||||
print("Installing Node.js v18.18.0...")
|
||||
try:
|
||||
# First check if Node.js v18.18.0 is already installed in common locations
|
||||
nodejs_paths = [
|
||||
r"C:\Program Files\nodejs\node.exe",
|
||||
r"C:\Program Files (x86)\nodejs\node.exe",
|
||||
os.path.expandvars(r"%APPDATA%\Local\Programs\nodejs\node.exe")
|
||||
]
|
||||
|
||||
# Try to use existing Node.js 18.18.0 first
|
||||
for node_path in nodejs_paths:
|
||||
if os.path.exists(node_path):
|
||||
try:
|
||||
version = subprocess.run([node_path, "--version"], capture_output=True, text=True).stdout.strip()
|
||||
if version.startswith("v18.18.0"):
|
||||
print(f"Found Node.js {version} at {node_path}")
|
||||
node_dir = os.path.dirname(node_path)
|
||||
if node_dir not in os.environ["PATH"]:
|
||||
os.environ["PATH"] = node_dir + os.pathsep + os.environ["PATH"]
|
||||
return True
|
||||
except:
|
||||
continue
|
||||
|
||||
# If we get here, we need to install Node.js 18.18.0
|
||||
print("Installing Node.js v18.18.0...")
|
||||
|
||||
# Create temp directory for downloads
|
||||
temp_dir = self.root_dir / "temp"
|
||||
temp_dir.mkdir(exist_ok=True)
|
||||
|
||||
# Download Node.js installer
|
||||
node_installer = temp_dir / "node-v18.18.0-x64.msi"
|
||||
if not node_installer.exists():
|
||||
print("Downloading Node.js installer...")
|
||||
try:
|
||||
import urllib.request
|
||||
urllib.request.urlretrieve(
|
||||
"https://nodejs.org/dist/v18.18.0/node-v18.18.0-x64.msi",
|
||||
node_installer
|
||||
)
|
||||
except Exception as e:
|
||||
print(f"Error downloading Node.js installer: {str(e)}")
|
||||
raise
|
||||
|
||||
# Install Node.js silently
|
||||
print("Installing Node.js (this may take a few minutes)...")
|
||||
try:
|
||||
# First try to uninstall any existing Node.js using PowerShell
|
||||
uninstall_cmd = 'Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -like "*Node.js*" } | ForEach-Object { $_.Uninstall() }'
|
||||
subprocess.run(["powershell", "-Command", uninstall_cmd], capture_output=True, timeout=60)
|
||||
|
||||
# Wait a bit for uninstallation to complete
|
||||
time.sleep(5)
|
||||
|
||||
# Now install Node.js 18.18.0
|
||||
subprocess.run(
|
||||
["msiexec", "/i", str(node_installer), "/qn", "ADDLOCAL=ALL"],
|
||||
check=True,
|
||||
timeout=300 # 5 minute timeout
|
||||
)
|
||||
|
||||
print("Waiting for Node.js installation to complete...")
|
||||
time.sleep(10)
|
||||
|
||||
# Add to PATH
|
||||
nodejs_path = r"C:\Program Files\nodejs"
|
||||
npm_path = os.path.join(os.environ["APPDATA"], "npm")
|
||||
|
||||
# Update PATH for current process
|
||||
if nodejs_path not in os.environ["PATH"]:
|
||||
os.environ["PATH"] = nodejs_path + os.pathsep + os.environ["PATH"]
|
||||
if npm_path not in os.environ["PATH"]:
|
||||
os.environ["PATH"] = npm_path + os.pathsep + os.environ["PATH"]
|
||||
|
||||
# Verify installation
|
||||
node_version = subprocess.run(["node", "--version"], capture_output=True, text=True, check=True).stdout.strip()
|
||||
if not node_version.startswith("v18.18.0"):
|
||||
raise Exception(f"Wrong Node.js version installed: {node_version}")
|
||||
|
||||
npm_version = subprocess.run(["npm", "--version"], capture_output=True, text=True, check=True).stdout.strip()
|
||||
print(f"Successfully installed Node.js {node_version} with npm {npm_version}")
|
||||
|
||||
# Clean up
|
||||
self.safe_remove_directory(temp_dir)
|
||||
return True
|
||||
|
||||
except subprocess.TimeoutExpired:
|
||||
print("Installation timed out. Please try installing Node.js v18.18.0 manually.")
|
||||
raise
|
||||
except Exception as e:
|
||||
print(f"Installation failed: {str(e)}")
|
||||
raise
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error installing Node.js: {str(e)}")
|
||||
raise
|
||||
|
||||
def setup_steam_config(self):
|
||||
"""Configure Steam for Decky Loader"""
|
||||
print("Configuring Steam...")
|
||||
try:
|
||||
# Add -dev argument to Steam shortcut
|
||||
import winreg
|
||||
steam_path = None
|
||||
|
||||
# Try to find Steam installation path from registry
|
||||
try:
|
||||
with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\WOW6432Node\Valve\Steam") as key:
|
||||
steam_path = winreg.QueryValueEx(key, "InstallPath")[0]
|
||||
except:
|
||||
try:
|
||||
with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Valve\Steam") as key:
|
||||
steam_path = winreg.QueryValueEx(key, "InstallPath")[0]
|
||||
except:
|
||||
print("Steam installation not found in registry")
|
||||
|
||||
if steam_path:
|
||||
steam_exe = Path(steam_path) / "steam.exe"
|
||||
if steam_exe.exists():
|
||||
# Create .cef-enable-remote-debugging file
|
||||
debug_file = Path(steam_path) / ".cef-enable-remote-debugging"
|
||||
debug_file.touch()
|
||||
print("Created .cef-enable-remote-debugging file")
|
||||
|
||||
# Create/modify Steam shortcut
|
||||
desktop = Path.home() / "Desktop"
|
||||
shortcut_path = desktop / "Steam.lnk"
|
||||
|
||||
import pythoncom
|
||||
from win32com.client import Dispatch
|
||||
|
||||
shell = Dispatch("WScript.Shell")
|
||||
shortcut = shell.CreateShortCut(str(shortcut_path))
|
||||
shortcut.Targetpath = str(steam_exe)
|
||||
shortcut.Arguments = "-dev"
|
||||
shortcut.save()
|
||||
print("Created Steam shortcut with -dev argument")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error configuring Steam: {str(e)}")
|
||||
raise
|
||||
|
||||
def setup_autostart(self):
|
||||
"""Setup PluginLoader to run at startup"""
|
||||
print("Setting up autostart...")
|
||||
try:
|
||||
# Get the path to the no-console executable
|
||||
services_dir = os.path.join(os.path.expanduser("~"), "homebrew", "services")
|
||||
plugin_loader = os.path.join(services_dir, "PluginLoader_noconsole.exe")
|
||||
|
||||
# Get the Windows Startup folder path
|
||||
startup_folder = os.path.join(os.environ["APPDATA"], "Microsoft", "Windows", "Start Menu", "Programs", "Startup")
|
||||
|
||||
# Create a batch file in the startup folder
|
||||
startup_bat = os.path.join(startup_folder, "start_decky.bat")
|
||||
|
||||
# Write the batch file with proper path escaping
|
||||
with open(startup_bat, "w") as f:
|
||||
f.write(f'@echo off\n"{plugin_loader}"')
|
||||
|
||||
print(f"Created startup script at: {startup_bat}")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error setting up autostart: {str(e)}")
|
||||
return False
|
||||
|
||||
def check_python_version(self):
|
||||
"""Check if correct Python version is being used"""
|
||||
print("Checking Python version...")
|
||||
if sys.version_info.major != 3 or sys.version_info.minor != 11:
|
||||
raise Exception("This script requires Python 3.11. Please run using decky_builder.bat")
|
||||
|
||||
def check_dependencies(self):
|
||||
"""Check and install required dependencies"""
|
||||
print("Checking dependencies...")
|
||||
try:
|
||||
# Check Node.js and npm first
|
||||
try:
|
||||
# Use shell=True to find node in PATH
|
||||
node_version = subprocess.run("node --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
|
||||
npm_version = subprocess.run("npm --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
|
||||
|
||||
# Check if version meets requirements
|
||||
if not node_version.startswith("v18."):
|
||||
print(f"Node.js {node_version} found, but v18.18.0 is required")
|
||||
self.install_nodejs()
|
||||
else:
|
||||
print(f"Node.js {node_version} with npm {npm_version} is installed")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Node.js/npm not found or error: {str(e)}")
|
||||
self.install_nodejs()
|
||||
|
||||
# Install pnpm globally if not present
|
||||
try:
|
||||
pnpm_version = subprocess.run("pnpm --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
|
||||
print(f"pnpm version {pnpm_version} is installed")
|
||||
except:
|
||||
print("Installing pnpm globally...")
|
||||
subprocess.run("npm i -g pnpm", shell=True, check=True)
|
||||
pnpm_version = subprocess.run("pnpm --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
|
||||
print(f"Installed pnpm version {pnpm_version}")
|
||||
|
||||
# Check git
|
||||
try:
|
||||
git_version = subprocess.run("git --version", shell=True, check=True, capture_output=True, text=True).stdout.strip()
|
||||
print(f"{git_version} is installed")
|
||||
except:
|
||||
raise Exception("git is not installed. Please install git from https://git-scm.com/downloads")
|
||||
|
||||
print("All dependencies are satisfied")
|
||||
except Exception as e:
|
||||
print(f"Error checking dependencies: {str(e)}")
|
||||
raise
|
||||
|
||||
def get_release_versions(self):
|
||||
"""Get list of available release versions"""
|
||||
print("Fetching available versions...")
|
||||
try:
|
||||
response = requests.get(
|
||||
"https://api.github.com/repos/SteamDeckHomebrew/decky-loader/releases"
|
||||
)
|
||||
response.raise_for_status()
|
||||
releases = response.json()
|
||||
|
||||
# Split releases into stable and pre-release
|
||||
stable_releases = []
|
||||
pre_releases = []
|
||||
|
||||
for release in releases:
|
||||
version = release['tag_name']
|
||||
if release['prerelease']:
|
||||
pre_releases.append(version)
|
||||
else:
|
||||
stable_releases.append(version)
|
||||
|
||||
# Sort versions and take only the latest 3 of each
|
||||
stable_releases.sort(reverse=True)
|
||||
pre_releases.sort(reverse=True)
|
||||
|
||||
stable_releases = stable_releases[:3]
|
||||
pre_releases = pre_releases[:3]
|
||||
|
||||
# Combine and sort all versions
|
||||
all_versions = stable_releases + pre_releases
|
||||
all_versions.sort(reverse=True)
|
||||
|
||||
return all_versions
|
||||
|
||||
except requests.RequestException as e:
|
||||
raise Exception(f"Failed to fetch release versions: {str(e)}")
|
||||
|
||||
def prompt_for_version(self):
|
||||
"""Prompt the user to select a version to install."""
|
||||
versions = self.get_release_versions()
|
||||
|
||||
print("\nAvailable versions:")
|
||||
print("Stable versions:")
|
||||
stable_count = 0
|
||||
for i, version in enumerate(versions):
|
||||
if '-pre' not in version:
|
||||
print(f"{i+1}. {version}")
|
||||
stable_count += 1
|
||||
|
||||
print("\nPre-release versions:")
|
||||
for i, version in enumerate(versions):
|
||||
if '-pre' in version:
|
||||
print(f"{i+1}. {version}")
|
||||
|
||||
while True:
|
||||
try:
|
||||
choice = input("\nSelect a version (1-{}): ".format(len(versions)))
|
||||
index = int(choice) - 1
|
||||
if 0 <= index < len(versions):
|
||||
return versions[index]
|
||||
print("Invalid selection, please try again.")
|
||||
except ValueError:
|
||||
print("Invalid input, please enter a number.")
|
||||
|
||||
def terminate_processes(self):
|
||||
"""Terminate running instances of executables that may interfere with the build."""
|
||||
for proc in psutil.process_iter(['pid', 'name', 'exe']):
|
||||
if proc.info['name'] in ['PluginLoader.exe', 'PluginLoader_noconsole.exe']:
|
||||
try:
|
||||
proc.terminate()
|
||||
proc.wait()
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
||||
pass
|
||||
|
||||
def run(self):
|
||||
"""Run the build and installation process."""
|
||||
# Terminate interfering processes
|
||||
self.terminate_processes()
|
||||
try:
|
||||
print("Starting Decky Loader build process...")
|
||||
self.check_python_version()
|
||||
self.check_dependencies()
|
||||
self.setup_directories()
|
||||
self.clone_repository()
|
||||
self.setup_homebrew()
|
||||
self.build_frontend()
|
||||
self.prepare_backend()
|
||||
self.install_requirements()
|
||||
self.build_executables()
|
||||
self.install_files()
|
||||
self.setup_steam_config()
|
||||
self.setup_autostart()
|
||||
print("\nBuild process completed successfully!")
|
||||
print("\nNext steps:")
|
||||
print("1. Close Steam if it's running")
|
||||
print("2. Launch Steam using the new shortcut on your desktop")
|
||||
print("3. Enter Big Picture Mode")
|
||||
print("4. Hold the STEAM button and press A to access the Decky menu")
|
||||
except Exception as e:
|
||||
print(f"Error during build process: {str(e)}")
|
||||
raise
|
||||
finally:
|
||||
self.cleanup()
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='Build and Install Decky Loader for Windows')
|
||||
parser.add_argument('--release', required=False, default=None,
|
||||
help='Release version/branch to build (if not specified, will prompt for version)')
|
||||
args = parser.parse_args()
|
||||
|
||||
try:
|
||||
builder = DeckyBuilder(args.release)
|
||||
builder.run()
|
||||
print(f"\nDecky Loader has been installed to: {builder.user_homebrew_dir}")
|
||||
except Exception as e:
|
||||
print(f"Error during build process: {str(e)}")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
90
install_decky.bat
Normal file
90
install_decky.bat
Normal file
@@ -0,0 +1,90 @@
|
||||
@echo off
|
||||
setlocal EnableDelayedExpansion
|
||||
|
||||
:: Check for admin privileges
|
||||
net session >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo This script requires administrator privileges.
|
||||
echo Please run this script as administrator.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: Check Python version
|
||||
echo Checking Python version...
|
||||
where python >nul 2>nul
|
||||
if %errorlevel% neq 0 (
|
||||
echo Python is not installed or not in PATH
|
||||
echo Please install Python and try again
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
for /f "tokens=*" %%i in ('python -c "import sys; print(sys.executable)"') do set PYTHON_PATH=%%i
|
||||
|
||||
:: Check dependencies
|
||||
echo Checking dependencies...
|
||||
|
||||
:: Check Node.js and npm
|
||||
where node >nul 2>nul
|
||||
if %errorlevel% neq 0 (
|
||||
echo Node.js is not installed or not in PATH
|
||||
echo Please install Node.js and try again
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
for /f "tokens=*" %%i in ('node -v') do set NODE_VERSION=%%i
|
||||
for /f "tokens=*" %%i in ('npm -v') do set NPM_VERSION=%%i
|
||||
echo Node.js !NODE_VERSION! with npm !NPM_VERSION! is installed
|
||||
|
||||
:: Add npm global path to PATH
|
||||
for /f "tokens=*" %%i in ('npm config get prefix') do set NPM_PREFIX=%%i
|
||||
set "PATH=%NPM_PREFIX%;%PATH%"
|
||||
|
||||
:: Ensure pnpm is installed globally
|
||||
where pnpm >nul 2>nul
|
||||
if %errorlevel% neq 0 (
|
||||
echo Installing pnpm globally...
|
||||
npm install -g pnpm
|
||||
)
|
||||
|
||||
:: Get pnpm version
|
||||
for /f "tokens=*" %%i in ('pnpm -v') do set PNPM_VERSION=%%i
|
||||
echo pnpm version !PNPM_VERSION! is installed
|
||||
|
||||
:: Check git
|
||||
where git >nul 2>nul
|
||||
if %errorlevel% neq 0 (
|
||||
echo git is not installed or not in PATH
|
||||
echo Please install git and try again
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
for /f "tokens=*" %%i in ('git --version') do set GIT_VERSION=%%i
|
||||
echo !GIT_VERSION! is installed
|
||||
|
||||
echo All dependencies are satisfied
|
||||
|
||||
:: Get the directory of this batch file
|
||||
set "SCRIPT_DIR=%~dp0"
|
||||
|
||||
:: Run the Python script with full environment
|
||||
echo Running Decky Loader installer...
|
||||
"%PYTHON_PATH%" "%SCRIPT_DIR%decky_builder.py"
|
||||
|
||||
if errorlevel 1 (
|
||||
echo Error during build process: %ERRORLEVEL%
|
||||
:: Clean up any remaining processes
|
||||
taskkill /F /IM python.exe /T >nul 2>&1
|
||||
taskkill /F /IM node.exe /T >nul 2>&1
|
||||
exit /b %ERRORLEVEL%
|
||||
)
|
||||
|
||||
:: Clean up any remaining processes
|
||||
taskkill /F /IM python.exe /T >nul 2>&1
|
||||
taskkill /F /IM node.exe /T >nul 2>&1
|
||||
|
||||
echo Build completed successfully.
|
||||
pause
|
Reference in New Issue
Block a user