【原創】解決NasCab掉程序,NasCab程序維護

ChayaSar發表於2024-09-19

最近物件吐槽家裡伺服器又連不上,看不了考研影片了。
我掏出手機一試,確實連不上。家裡的伺服器是Win11平臺,用NasCab管理的影片檔案,然後透過frpc做的內網穿透。
我們在外面的圖書館,連不上無非是三種情況:伺服器關機了、NasCab內網穿透外掛掉了、NasCab程序掉了。
遠端登入伺服器,發現是NasCab程序掉了。。。點開NasCab,1分鐘後物件又可以愉快的看考研影片了。
我想了想,決定寫個指令碼處理一下這事,因為我也時不時遇到NasCab掉程序的情況,我之前都是忽略了,但現在意識到這會影響體驗。
思路:寫一個維護程序的指令碼,迴圈掃描nascab程序,檢測不到就開啟NasCab。
要求:該指令碼不能受NasCab影響,同時該指令碼也不能影響NasCab,那就需要另一個終端開啟nascab,於是是bat->cmd->powershell->NasCab,這樣只有powershell視窗會被影響,關掉cmd不會影響NasCab。
實現程式碼為:powershell -command "& {Start-Process %executable%}",其中executable為要執行的程式,就是nascab。
注意nascab的路徑要加入path,路徑為:C:\Users\hpl\AppData\Local\Programs\nascab\NasCab.exe,其中hpl替換為自己的使用者名稱。
然後讓這個指令碼開機自啟動就可以了。實現方法可用建立任務計劃,也可直接拖入啟動資料夾。

完整程式碼如下(全網首發,轉載請保留出處):
取名Gaia是因為我愛玩零之曙光,裡面的Gaia功能強大,hhh

點選檢視程式碼
@echo off
rem 關閉echo命令顯示

chcp 65001
rem 強制開啟UTF-8,以支援中文顯示

rem 為本指令碼獲取管理員許可權
ver | findstr "10\.[0-9]\.[0-9]*" >nul && goto powershellAdmin

:mshtaAdmin
rem 原理是利用mshta執行vbscript指令碼給bat檔案提權
rem 這裡使用了前後帶引號的%~dpnx0來表示當前指令碼,比原版的短檔名%~s0更可靠
rem 這裡使用了兩次Net session,第二次是檢測是否提權成功,如果提權失敗則跳轉到failed標籤
rem 這有效避免了提權失敗之後bat檔案繼續執行的問題
Net session >nul 2>&1 || mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c ""%~dpnx0""","","runas",1)(window.close)&&exit
Net session >nul 2>&1 || goto failed
goto Admin

:powershellAdmin
rem 原理是利用powershell給bat檔案提權
rem 這裡使用了兩次Net session,第二次是檢測是否提權成功,如果提權失敗則跳轉到failed標籤
rem 這有效避免了提權失敗之後bat檔案繼續執行的問題
Net session >nul 2>&1 || powershell start-process \"%0\" -verb runas && exit
Net session >nul 2>&1 || goto failed
goto Admin

:failed
echo 提權失敗,可能是防毒軟體攔截了提權操作,或者您沒有同意UAC提權申請。
echo 建議您右鍵點選此指令碼,選擇“以管理員身份執行”。
echo 按任意鍵退出。
pause >nul
exit

:Admin
echo 本指令碼處理所在路徑:%0
echo 已獲取管理員許可權!
ping 127.0.0.1 -n 1 > nul
echo 如果此視窗標題處顯示“管理員”字樣,那就說明提權成功了。

echo 嘗試將工作目錄轉移到軟體目錄...
cd /d %~dp0
rem 切換軟體工作目錄到軟體所在資料夾
ping 127.0.0.1 -n 1 > nul
echo 目錄轉移成功!

rem 在後臺執行本指令碼
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin

rem 在這裡設定目標程式
:: 程式路徑需加入Path: C:\Users\hpl\AppData\Local\Programs\nascab\NasCab.exe
set executable=nascab
set /a counter=0
set TITLE=GaiaNasCab-background-admin[1.4]

rem 設定標題
title %TITLE%

echo -------------------------------------------------------------------------------- > %TITLE%.log
echo [%DATE%%TIME:~0,8%]本指令碼[%TITLE%]正在以管理員模式執行! >> %TITLE%.log
echo 本指令碼用於守護%executable%,保證其始終處於執行狀態 >> %TITLE%.log
echo 更新於:2024年9月19日,by HPL. >> %TITLE%.log
echo -------------------------------------------------------------------------------- >> %TITLE%.log
echo: >> %TITLE%.log
echo:
echo --------------------------------------------------------------------------------
echo [%DATE%%TIME:~0,8%]本指令碼[%TITLE%]正在以管理員模式執行!
ping 127.0.0.1 -n 1 > nul
echo 本指令碼用於守護%executable%,保證其始終處於執行狀態
ping 127.0.0.1 -n 1 > nul
echo 更新於:2024年9月19日,by HPL.
echo --------------------------------------------------------------------------------
echo:

echo [%DATE%%TIME:~0,8%]目標程式掃描中... >> %TITLE%.log
echo: >> %TITLE%.log
echo [%DATE%%TIME:~0,8%]目標程式掃描中...
echo:


:checkrun
tasklist|findstr /i "%executable%"
if errorlevel 1 (
echo [%DATE%%TIME:~0,8%]未檢測到正在執行的%executable%,準備開啟%executable%... >> %TITLE%.log
echo counter[%counter%] >> %TITLE%.log
echo -------------------------------------------------------------------------------- >> %TITLE%.log
echo [%DATE%%TIME:~0,8%]未檢測到正在執行的%executable%,準備開啟%executable%...
echo counter[%counter%]
echo --------------------------------------------------------------------------------
goto start
)
if errorlevel 0 (
rem 掃描時間建議5分鐘以上,避免更新NasCab時被觸發本程式
echo [%DATE%%TIME:~0,8%]已找到%executable%,迴圈掃描中[300s]...
echo counter[%counter%]
echo --------------------------------------------------------------------------------
ping 127.0.0.1 -n 300 > nul
goto checkrun
)
ping 127.0.0.1 -n 5 > nul

:start
echo: >> %TITLE%.log
echo [%DATE%%TIME:~0,8%]正在開啟%executable%... >> %TITLE%.log
echo:
echo [%DATE%%TIME:~0,8%]正在開啟%executable%...

rem 使用powershell後臺執行NasCab(測試用)
::powershell -command "& {Start-Process %executable% -WindowStyle Hidden}"

rem 使用powershell前臺執行NasCab(效果好,強烈推薦)
powershell -command "& {Start-Process %executable%}"

rem 前臺執行NasCab(禁用,此方式NasCab會將程式log注入本bat所處的cmd,關掉本bat同時會關掉NasCab)
::start %executable%
ping 127.0.0.1 -n 1 > nul
echo:
echo [%DATE%%TIME:~0,8%]已成功開啟%executable%! >> %TITLE%.log
echo [%DATE%%TIME:~0,8%]已成功開啟%executable%!
echo counter[%counter%] >> %TITLE%.log
echo -------------------------------------------------------------------------------- >> %TITLE%.log
echo: >> %TITLE%.log
echo [%DATE%%TIME:~0,8%]5s後進入執行狀態檢測checkrun... >> %TITLE%.log
echo: >> %TITLE%.log
echo:
echo [%DATE%%TIME:~0,8%]5s後進入執行狀態檢測checkrun...
ping 127.0.0.1 -n 5 > nul
set /a counter+=1
goto checkrun

使用效果:
程式執行時會在bat所在目錄生成log日誌,可觀察執行狀態
image