From 402c52b00aaddabb5621fdd645e87152df457e1c Mon Sep 17 00:00:00 2001 From: yuejiajun <1530620364@qq.com> Date: Mon, 18 Aug 2025 17:07:25 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90783=E3=80=91executor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model_full/Execute/win10_783/convert.bat | 31 + .../model_full/Execute/win10_783/convert.ps1 | 28 + server/model_full/Execute/win10_783/icon.ico | Bin 0 -> 86825 bytes server/model_full/Execute/win10_783/patch.ps1 | 109 ++++ .../model_full/Execute/win10_783/shutdown.bat | 53 ++ .../Execute/win10_783/startup-console.ps1 | 530 ++++++++++++++++++ .../model_full/Execute/win10_783/startup.ps1 | 488 ++++++++++++++++ 7 files changed, 1239 insertions(+) create mode 100644 server/model_full/Execute/win10_783/convert.bat create mode 100644 server/model_full/Execute/win10_783/convert.ps1 create mode 100644 server/model_full/Execute/win10_783/icon.ico create mode 100644 server/model_full/Execute/win10_783/patch.ps1 create mode 100644 server/model_full/Execute/win10_783/shutdown.bat create mode 100644 server/model_full/Execute/win10_783/startup-console.ps1 create mode 100644 server/model_full/Execute/win10_783/startup.ps1 diff --git a/server/model_full/Execute/win10_783/convert.bat b/server/model_full/Execute/win10_783/convert.bat new file mode 100644 index 0000000..b4c2590 --- /dev/null +++ b/server/model_full/Execute/win10_783/convert.bat @@ -0,0 +1,31 @@ +@echo off +setlocal + +:: 时间: 2023-10-14 17:54:07 +:: 作者: 岳佳君 +:: 版本: v0.0.2 +:: 功能: 调用同名 ps1 脚本,临时授权可执行 + +:: 获取当前批处理脚本的目录和名称 +set "bat_path=%~dp0" +set "script_name=%~n0" + +:: 检查同目录下的同名 .ps1 文件是否存在 +if not exist "%bat_path%%script_name%.ps1" ( + echo Error: PowerShell script "%bat_path%%script_name%.ps1" not found! + pause + exit /b 1 +) + +:: 以 UTF-8 编码运行 PowerShell 脚本 +echo Running PowerShell script (UTF-8): "%bat_path%%script_name%.ps1" +powershell.exe -ExecutionPolicy Bypass -Command "& { [Console]::OutputEncoding = [System.Text.Encoding]::UTF8; . \"%bat_path%%script_name%.ps1\"; exit $LASTEXITCODE }" + +:: 检查执行是否成功 +if errorlevel 1 ( + echo Error: Failed to execute PowerShell script. + pause + exit /b %errorlevel% +) + +endlocal diff --git a/server/model_full/Execute/win10_783/convert.ps1 b/server/model_full/Execute/win10_783/convert.ps1 new file mode 100644 index 0000000..f128d48 --- /dev/null +++ b/server/model_full/Execute/win10_783/convert.ps1 @@ -0,0 +1,28 @@ +#!PowerShell + +# 时间: 2025-8-6 15:24:00 +# 版本: v0.0.2 +# 功能: 转化工具,将 ps1 转为可执行 exe 文件 + +# Set-ExecutionPolicy RemoteSigned -Scope Process -Force +# Import-Module ps2exe -ErrorAction Stop + +Set-ExecutionPolicy RemoteSigned -Scope Process -Force +Write-Output "Convert EXE" +Import-Module ps2exe -ErrorAction Stop + +# 转化参数 +$PS1_NAME = "startup" +$APPLICATION_NAME = "model" +$APPLICATION_VERSION = "1.0.0" +$COPY_RIGHT = "© 2025" + +# 基本启动,无 console,可配置开机自启 +Invoke-PS2EXE -InputFile "${PS1_NAME}.ps1" -OutputFile "${APPLICATION_NAME}.exe" -IconFile "icon.ico" -version "${APPLICATION_VERSION}" -copyright "${COPY_RIGHT}" -requireAdmin -ErrorAction Stop +# 基本启动,提供 console,用于 debug +Invoke-PS2EXE -InputFile "${PS1_NAME}-console.ps1" -OutputFile "${APPLICATION_NAME}-console.exe" -IconFile "icon.ico" -version "${APPLICATION_VERSION}" -copyright "${COPY_RIGHT}" -requireAdmin -ErrorAction Stop +# 基本启动,两种x +Invoke-PS2EXE -InputFile "${PS1_NAME}.ps1" -OutputFile "${APPLICATION_NAME}-x86.exe" -IconFile "icon.ico" -version "${APPLICATION_VERSION}" -copyright "${COPY_RIGHT}" -x86 -requireAdmin -ErrorAction Stop +Invoke-PS2EXE -InputFile "${PS1_NAME}.ps1" -OutputFile "${APPLICATION_NAME}-x64.exe" -IconFile "icon.ico" -version "${APPLICATION_VERSION}" -copyright "${COPY_RIGHT}" -x64 -requireAdmin -ErrorAction Stop +Write-Host "Complete." -ForegroundColor Green +Start-Sleep -Seconds 1 diff --git a/server/model_full/Execute/win10_783/icon.ico b/server/model_full/Execute/win10_783/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b9bdeb726c2365bab05f627d1e6e54d502be440d GIT binary patch literal 86825 zcmYgWRa9I(xSbi?2X}9A3dP-}EiT2K;$GYbcPUPB_W}iqyB2qMDK1lN(7FBZeYrU+ zD_QG2oaD<+PWIj(008{={8xYg8UVfq5J2>=AEl}+kA+T#{;!Mm@q>)|e{cV*sL1~s zgRkY5000E=QASeJYxS(tyT@JoGxf8+-KGB|W$r@`_mt@e8m=iinqYKX+=9i{#mc6d z#o4JvY}*>^rboefp#mnBw8CH}R1hwv2I?E|h+@+HM3$%D(9`;kqHpbGf@rpD9->PR za(5SsWA4-D&bsf^rrl%BmR^kW1q{XW`Pr$PdU!IW8g#Rn_}y(v7e?;{^@VF@GJ6g>%t?-*LCN9 zEZ7ayzvc2q*C5~(&w~MJC=5wv&%GN44%pqI;;|@6W3Rxl`&Pv^zlZerUJGV6+>y|z z7s^HY!47~)$1n&{rvYVr%rJ>EA^cbrSsHC4ot(|X=1EehLOOCD?c$a=cgNpt()^ft zUtMU!md4$CBC&Ux=Ykk`Gc)Hk{#IJ#;%c|Z|Mw(iVBB6d2u3H490J@7*kgx{D3v)M z5Gn|`*hbfUL&~@+WX%wBcIxD*+SvOPbGX1cu^2~4UE0)~f)&X!(UMM!#*(wa z*n5zsL;?_rDuc)XLNEbke8?DJmMfy2Q{1n%e5khcY*4!x8XsZ2$60uUesd+YgCLG! z#QMgkdp#crZoc|h3)wfDT<&TSdg}1 z(9+ARAxg}wn6KWb_M)?oXyuu~Gn$Q%GK+FBvr7MA7X)z#@*$WX71e63qP%$sDAi-t;NgxgCdqhme z?*=(h8^;Zu>{i|iKcHnxMsIO8U7A1qAgl&-iq#4K5`c4FB@G*0SsSmq4(I;watX;G z!e5lA2eaTe8ZEDn9D`g#bxL7zYEcMd>su=hxoUhTSq!PKvzdF>w&fkP48wXd%&4rY z&Zh+(O%b!dPw=@Tw^ISM&sj;+@;CqqR3rgWDk%^r058xSLXd6k5*M^_#(H00@Tq}xB_|E*Qocd5}TTP_vWv!c%!+*lgWq8J&LhoYd z<_x2RMrZ&U+@1%pR8)y#^}cgM_Q9*-iun2I zNuXh4?c@B$uu_AQ+RnUI)Qf`Pg_lXN9fxth?9^t2RgMN?!m7)~sQ9Ph+I2r}KCy-E z?E($f> zE8wnAS?y}29cnV}4VbULqX{0!p*f?*XaR)H;iFK{gaZ@v0nbW^CN8SV`2a4kRXNpd z`J-a|9~@uwK$yyAEK0z`=ivSrWJY;jt#HA`=F%1uIJyxu)>UGs=)cVfkHEq04ScFe z*kw*wiO|2;9FQ(66}Y?t7e)04l~gwK4splm85!!{T9jnOupV^)d%qD4qbuXS$$uye zexly+wFJBGzR5$tEvUEy=zU$nUzt$Wx z@Xy17NLPVJEf1Exd4Ycz{3bN=B0c?fJ+fC=TsFzf{WW*ch&fJul@;?iYYyz9kvVE8 zj18mo>_>X)iN*-nM5lE9m@XfERXK)E9looeo}0hFkhi<7zpwRDvxK>#17+~013}5? zhiE(?02^LFftMo9E`oB;u7vY|GiRNJ@VU;v)^`g6 zjb_faMSa}V-NAN~#y*YdXYlC%HnOjn45Ik8FLhtSYpw7Vb@wZDd70g%cNKlHS>d_t z@_7kXTMLgGE5+*W`1SZWTVcmCY==c4Y>BG{F4+#QE7K8g`HPLHE=f8L^pTVjwh?ve zWo8#Z8p|_)PikdgU`VZB7NI)2APSVbiPZ`UtcSreAlsrKfC*#qjtNb2_IF?3%7<%N zcKDOa*hN|ve~Zy5;u?3DKf-p>0w#|A=N5Ylw5f+A*Vw-9ssA0X$R5(c9Z zbkH4rTO+G`a!bhawA9SvLBKVY!l0%O~_S&mYz4Y1+o%rTQ9L{13HT zV=fn!0YM4U5!gFJ`WFM#oriNRH@mzdZeK$$eJ8k~4NfqyvLmO~-O^LctVp-x{8*Ko zXggk8KH|@Cl0H4K`BOXyJO~D}to3|B9zA-KN#OT2>fLK@i&z&!!BfuVV=IOyo+_s& z%LxmyOs6y;xGAA89)f~6xZMiP;rT5UlEUQ9UuCZ`ewM(fnem|F#UTxf|zn)6dg(!D6pqQEVY5wuS zXvn%&b*_W(auvq3a-2B%uuES9+P+hQj_=3;ybB!jg0vAQ-~LsVAPFG`JA-J#k=%#= zny9qmV5Rs!1-o3rZ&qH9htKS;#$%9S(+F!i6Rz30$}Tg`NF4rmCq}~$`{QcTycq(L z!lzIInF8qzix!!cgS2Y=3k+Zqn@{l-UTE+^T)jWc(X~AAxht{NPh3XbM1lw2c4PEu zMhub<{xivO{_re|CIATIr0L>diGh%#=F=8`G+8DRY<=>v7oXSuJ8UQV+A~Ah?wZdC z`?K`&cJoSlYS4Ddq{!a+_%GPlV`H_b^9H{CU$`%wpGPP7&3!z>E}!I82B*4?8Diy# zP_zjao7rCHJOfc{pUw{r_}HPltFzjRTB0=`e^k*zB8xK1Jqb}vXAPn7yHPE!-1^>8}A7+g-g=mw|QHIe_ zUg3fW2>~4-RVfqHND9)gBOfjO`*H-w+FgIV?yJ^zJRA)WC~) z^xFk>1#E54Y@)+W{+of5_j6yCSoB`m(Aau5Sf=ah!KBv;uV?P@ao)i!y8v>!V~}=>hIqTR~6FiuTU5}j|3_1*QE38QCf20d5Z+{aIM)Aw|!npBus!?8g7_`?qKIcvtN+Czt0N^34!x zSQ_!}aKNo0Y*73Wwd?TFYHvA{IoI#DpoDwvcFu~hvl{Qkf^hyb)^Rm0(%2^v8%E8e zlYCe++-zTW*lyudxVev3H%o+Uw1tj7v@wTSf~R6Zr5bCvE{zwPI`%iiH!xY#qQ zl?sbA2piyK>r8O??j&)O5E>dkx`QnS2n|3qv8EfXki?m&h|Nl{{IVtZ#pk}+zi%Bb z-aW88T{u)>6A~gFGM9`#)oPEsWaRhG0mlCy^t*SU#sNDHIvdTQ$z>kSS0gM`BK0xD z#%t&4i6ezgyRN>bECg)zr74cT_CwDgJ!BFb0Q;LTN*LLAkp!+*^+Q!FCWi ztqDvn!Tq6GR%pFuL3@7IQy8-=@?;8lD+vS`2{6g5W3wM4qXJCj8&{=gshjylj@Aoq zdL@CXOVRR3+d^gMNijmvAM^nAr?g&4rZFEHv)`)FDjNZp#fhRmfYoPvBCEb833H{1 zzpwNjTTqx&q0C`#OBZpB^xP8bWuzk68Sc7JXS=^G>a=*3q&Ot#F}{ZVhCh@ghC82j zGCEIK9PTY``Vnox+!eIrS#KvAH?h<(NXM*>w0xP9<=LFbo^VcCYy8&@(u-o4kLx9N?t~X%glFoNt>5=ZbKD_b! zkT%(nDuWkd{k(uTG9^b)#asM(fzbiUE~oN+ew@2=Uw%uTc3A$<%p8`OzZ>z^ zO$qV#ar!Owxx=+=V75l`KeAP31P9jTY>)PjmD`5}!r3`WH&&>{U3{1Pm&PkRB_~7&i6j6S91EFqLSeu4ZZ;v++mdP9OQDoW$JdT)ENUeg@%IVWLOx>2Wxbe zPj%P5$=|Yb+G|=wmPrPO+(M?Y>=ZBAsV#HXliicr6)M_v;Vw1TPW~(Fll0ZJ zjWT;9==mxm@RhIzHpFG}jZf>ctLn2DZFR;R-uv-HiTz_s6vXR7J{+28HwffPo~|Z? zzA15MpjQxMYc+AM$=s$pMgW+dG|D2oo7+p|pVITG`=S5*lcj=SfjYX=^VPAu?~~sQ z^*>x33OWitXl09epg-MH_XR$A8e>>(c^oV6ba`r?)KbP!@qEJgfE1&=-Lo4L*@gHw z9wS!Z7&Y)zm~n2oe&O6)LSY$d(-NQa|vxcz@Ssmmefs zOK*Z4+}fauj#C(3u>U%?IrX=;(hl_*gCV6^r~~eyd=T#>bQ_^i@+jp7Ld+&W;?b;A0n?Ba;pPfJnpA&kBoes4Us z55@Gb2KPnZTPl3SgV2kRM#0` zte|CSdHitu&bc1h2p|x2P06+0;FVHcI`vcV0~pikjWA}8V+x@0B0ylZj^=Tfohid; z?!gK3`0X~vq#hGxlKpOnZ9#m|rW#$&FKX9%crMOKNAoGI3=%=#8!41Gx4~1RR-g>j zXrKd$J)i_I@%kQ{IAnmBSm-o0!lDPL9(7Svzm%NZOgYZbY_EyjOw|dW*_1M#|Bu#q z$Jfjd1U{|;yH1-c>66K(vIHj$@~@%`zxbOAVfW5H*$PaxrteD$zZoEZm$HPOfe<;g z85R$H_ja<2*zFiqxBB;CCqp3B*5x*WuMs0&btk;J0lT_w0VJXQ;+#H#pR4dI&}p$Q zE4p|Q1KNP5cdCL}$G|kGx_U37HVV%o%*V=4k!X1HHjyL>8_a6WQ=le+gmjA7G?J>f z@6BDPqLN*~p=%iMe^FKj`sJF7)IiMx6APHmWgGO2btGwn1Mtjr3D-U3L3G6EU+t}H z2Wfy52yC0?V4XxJu%LjvYP1C2ce}(8aB~JpvxqmqmD2A+oxI5&w{Jqkn!Q=D8G;N| zZ?2ne((!&+qfOVHan7{|Qy=bCj6W)hmHgp=a6`rAZJ;{ zxeAlkHbs7;go`tft*E~8kWG9g`rOI9{$1t7|AX;Rm`SsTroND>;D!Fi&Uyd+z%|j9 zY{!JYBecG&4p~Ry({_&uW1VuoTYmf3?aq&XcO}oZrRY^$l4dO&##N{c6UzN}uiZq# zTM3L5@6|pHHyvK@*0jXT1YVSj`A`|QI6GAumb))yqU|%Lc=uY>UKQe*C`kgrv3Gs7 z1VK%RIFNi&)i={Seu`JonutmW^KT$XCZuLj<@?v6S5EE|2Z)Gc9F-=I6QK}<{=vkwg=U>X-E7kw zmByF_-5yOkYK_CN;HBz0C=HK5!^`ly3gd2uaDV@TR6bf6CTRL25po@eP9Q@a_C=?a zWQ4xgzvX!Ku?d4^3If+;Tui|IQ-@l6c@56pv{W1ykvY%87gqhbTG>_}U zFMO??PI|j%;OBg-l8BET3->0u^2bFbhcGX2K*^hyX9(XuoU$%>{z0UXyhtE1R7&`7 zPf%oTh6c7Af^wA3Hw{6x`i?adwW|Mz)OW2{G`WH2VX!00tcJdG&Am9%Plp=*8y)^* zeb>(ci`a!oy8x|Mcg%2{Go*2JWrOeg2t}PV$hDFg{_X~{4Lxo(1(+ zJZd-chmStWReXQ$X;lgQprG8)?!9K2zjRH;$zl0nJzCog?h{SIHBBB&pC|D|)(nHULW^x8 zg$VWu4t!fDr5Syjf+nNW%4h6Vwq{wMgUhVxzxV;#4vH3jV$`#a+=2L87i(38AZe*+)Rej3IvpRTx_+A&_% zO%hot#1KW?KrPScz3E0@f3I5!+d*5L0;#+12~p&~yTJd_1P+Z(LyMOsHTV-t!(I8_ z4lUzmPzs<5H%erKWP6v0=*Z|WwMKoBcITq{k~jf%A)LP2#z;D<1IZB?9Z3M+aEU8q zztfBOx`C8Dk)J)_@;~bDOP%3IY*#8(YgGN>Cm=ic^(rq@oew=b4=PYU8Y-AlwMmix_H5GGNp#| zh7P6#?23aVIL*WMhm}n|g(TTQE|T?JWxMY}sgR@5h5)2?n2)5ncP(P?w(fE5Cv#(( zUd20J5sVuJlk(s>D%(q2;(eZC-3c`x!*mCiGeO4JBJ0On&j=b7M5N|-6l9A*))2r<(V)0d367Trm_`9;295nfTw_{y|dOdg>+R>$XSr+e@eH!Fk=r z*}dZK!hr8sUGz=Cr&E_#m{s`*ZCx_7V%y{6uR@G{vBW&KNC_q-tF?cimTbJk>)LK0 z7y@AE?T{OJ;Re9i8SA+SNGy8KI7bMu4eP>H#GNr!{Qi9Qf^Nr4Kk_ZVYXzT zlLg_)?nVxBC2NdhA;g!vC}gHOc^`X@+6BTB>XP&^xg;lp?Xa<+@l)B7#<)Iu(v#hk zC(DB^H_sO9_tQsEVeb3z1`Y4o$Kv9+IKxv$rs(ZT9K&h#Es+W^_QjzA`k|sj{IY9>WD1wx3hYu4i1-~+WCJEai)dtarsNST z)kBMxK{Hxd8%&s~tE6==o-yA8UhLma3?jtAAG5l{ocy6Nb^4Q>%#@B@p5(ROlLsV( zZ*31%d17-a2IomTob0dyp?$tr&;|vj>;f{eG?z1O91M_PIl9PwRc`2|&o%O$MpRhr zG(V_@ErWd#xrfr~QJ_)r=$^nQ+{Mzs+}-3#Nd>;!Pv6Bv&@=V&Dt|RC-QIFjC@bP- z8{OS*?6ge4-x53#Ww7vh6|HqNfICvvRjy$SQz^XazwyU&{-PvX znJ=V}SO!ZbKqscw6O12vK33oG8eK;x?6Eufll>4-*=xJ*7O*9t`iw+F2b)=fBmHQ# zCe7>cBi-Fq1@z1w7*qcOv@AYf#l-PR*%XdacvG@#8N978z+r0v|! zaIKrwvng#{Gbg5E%>7kc4dNfyeE<80nJ$0q-kYzrT5b_qH#S7Rc{(e$qd#BEVw!(9 zZ}|%%YwqbNHPWktyFc8^;8fEyOG zmq2gQ6Ro(_TLak-mV@>EtS81ejL^;MFNVbd1wc#^Le_1HZa&mkK7L>44?L87I5rju85}or$cJwG#L++bzy@CEMGj70yl(NS zUx@xBkfFlNyI%uZrVs8&wcqVcqR7KKJw-$FI!`lUGaL^zFAW^p7;72^s{;3pt1}Jc zSMFHH7&)^s%FO4HA4c>gW&>RHwR(eHFw&T5wPe_$375eID$ZkyEs!8auHK(5Qo6o+ zf^8EE7aUpPVtjABz9VC}eJkY_XYO84 z-?GM4T{FcSa1OB6Zotc#A@YL=Ej!`lS36I zTdP;P@UP8ya?X@hIcvoa63&yU9*de2zsx?PyK7{cNJ^NdY8(qidMY;{*A@_ArhyGq)m

o_J*(yXd4E4dE#kOO$ROe9Jq^v{rX5XUJT21O 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%0A-MI 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 RK=c3r002ovPDHLkV1gEu`kw#* literal 0 HcmV?d00001 diff --git a/server/model_full/Execute/win10_783/patch.ps1 b/server/model_full/Execute/win10_783/patch.ps1 new file mode 100644 index 0000000..ed80960 --- /dev/null +++ b/server/model_full/Execute/win10_783/patch.ps1 @@ -0,0 +1,109 @@ +#!PowerShell + +# Function: Import data from script files or RAR script files into MySQL specific libraries +# Author: JiangJun +# Create-Time: 2025-8-10 15:57:26 +# Version: 0.3 + +# Set-ExecutionPolicy RemoteSigned -Scope Process -Force + +$logFile = "ScriptExecutionLog_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt" + +function Write-Log { + param ( + [string]$message + ) + $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + $logMessage = "[$timestamp] $message" + # [debug] + # Write-Output $logMessage | Out-File -FilePath $logFile -Append + Write-Host $logMessage +} + +function randomText { + $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'.ToCharArray() + $length = 12 + $random = New-Object System.Random + $string = -join (1..$length | ForEach-Object { $chars[$random.Next(0, $chars.Length)] }) + return $string +} + +function Import-Script { + param ( + [string]$dbServer, + [string]$dbPort, + [string]$dbUser, + [string]$dbPassword + ) + if (Test-Path -Path ".\script" -PathType Container) { + Write-Log "Found script folder, starting to process .." + $subFolders = Get-ChildItem -Path ".\script" -Directory + if ($subFolders.Count -eq 0) { + Write-Log "There are no subfolders in the script folder, skipping processing." + exit + } + + foreach ($folder in $subFolders) { + Write-Log "Database connection parameters - Please modify according to the actual situation $($folder.Name)" + $rarFiles = Get-ChildItem -Path $folder.FullName -Filter "*.rar" + if ($rarFiles.Count -eq 0) { + Write-Log "There are no SQL files in the folder $($folder.Name), skipping." + continue + } + + foreach ($rarFile in $rarFiles) { + Write-Log "Processing file: $($rarFile.Name) (located in $($folder.Name))" + $rarName = $rarFile.BaseName + $rarDirectoryName = (Get-Item $rarFile.FullName).DirectoryName + try { + Start-Process -FilePath "rar" -ArgumentList "x -pshzyh!234 `"$($rarFile.FullName)`" `"$rarDirectoryName`"" -NoNewWindow -Wait + if (Test-Path $rarFile.FullName) { + Remove-Item $rarFile.FullName -Force + } + } catch { + Write-Log "Error unrar $($rarFile.Name):$_" + Write-Log "=> $($rarFile.FullName)" + } + } + } + + foreach ($folder in $subFolders) { + Write-Log "Database connection parameters - Please modify according to the actual situation $($folder.Name)" + $sqlFiles = Get-ChildItem -Path $folder.FullName -Filter "*.sql" + if ($sqlFiles.Count -eq 0) { + Write-Log "There are no SQL files in the folder $($folder.Name), skipping." + continue + } + foreach ($sqlFile in $sqlFiles) { + Write-Log "Processing file: $($sqlFile.Name) (located in $($folder.Name))" + $dbName = $sqlFile.BaseName + try { + Write-Log "Creating database $dbName and importing $($sqlFile.Name)" + Start-Process -FilePath "mysql" -ArgumentList "-h$dbServer -u$dbUser -p$dbPassword -P$dbPort $($folder.Name)" -RedirectStandardInput $sqlFile.FullName -NoNewWindow -Wait + Write-Log "Successfully imported $($sqlFile.Name) into database $($folder.Name)" + + $date = $(Get-Date -Format "yyyy-MM-dd") + $random = randomText + $target = ".\patch\$($date)" + New-Item -Path "$target" -ItemType Directory -Force + Start-Process -FilePath "rar" -ArgumentList "a -pPassword#$date! -hp $target\$($random).rar `"$($sqlFile.FullName)`"" -NoNewWindow -Wait + + if (Test-Path $sqlFile.FullName) { + Remove-Item $sqlFile.FullName -Force + } + } catch { + Write-Log "Error importing $($sqlFile.Name):$_" + Write-Log "=> $($sqlFile.FullName)" + } + } + } + + Write-Log "All script processing has been completed." + } +} + +# Param 1: MySQL IP +# Param 2: MySQL Port +# Param 3: MySQL root +# Param 4: MySQL root_password +Import-Script "127.0.0.1" "33306" "root" "Root@2025" diff --git a/server/model_full/Execute/win10_783/shutdown.bat b/server/model_full/Execute/win10_783/shutdown.bat new file mode 100644 index 0000000..03bb7c2 --- /dev/null +++ b/server/model_full/Execute/win10_783/shutdown.bat @@ -0,0 +1,53 @@ +@ECHO OFF + +:: 时间: 2025-8-3 14:18:20 +:: 作者: JiangJun +:: 版本: 0.0.4 +:: 功能: 关闭 springboot 整体服务(需要配合 XManage 运行环境) + + + +:: Nginx 执行 EXE 名称 +set "nginx_name=model-web.exe" + +:: Nginx 代理端口号 +set "nginx_proxy_port=:18680" + +:: 服务端口号 +set "server_port=:28680" + +:: 数据库端口号 +set "database_port=:33306" + +:: MinIO端口号 +set "minio_port=:9000" + + + +:: 关闭web +set "X=" +for /f %%a in ('netstat -ano ^| grep -v "WAIT" ^| grep "%nginx_proxy_port%" ^| head -n 1 ^| awk "{print $NF}"') do @(set X=%%a) +if defined X taskkill -f -pid %X% + +:: 关闭代理 +set "X=" +for /f %%a in ('tasklist ^| grep -v "WAIT" ^| grep "%nginx_name%" ^| head -n 1 ^| awk "{print $1}"') do @(set X=%%a) +if defined X taskkill -f -im "%nginx_name%" + +:: 关闭后端 +set "X=" +for /f %%a in ('netstat -ano ^| grep -v "WAIT" ^| grep "%server_port%" ^| head -n 1 ^| awk "{print $NF}"') do @(set X=%%a) +if defined X taskkill -f -pid %X% + +:: 停止数据库服务 +set "X=" +for /f %%a in ('netstat -ano ^| grep -v "WAIT" ^| grep "%database_port%" ^| head -n 1 ^| awk "{print $NF}"') do @(set X=%%a) +if defined X net stop x_database + +:: 关闭MinIO +set "X=" +for /f %%a in ('netstat -ano ^| grep -v "WAIT" ^| grep "%minio_port%" ^| head -n 1 ^| awk "{print $NF}"') do @(set X=%%a) +if defined X taskkill -f -pid %X% + +:: pause +timeout /t 3 /nobreak >nul diff --git a/server/model_full/Execute/win10_783/startup-console.ps1 b/server/model_full/Execute/win10_783/startup-console.ps1 new file mode 100644 index 0000000..3f1d4f5 --- /dev/null +++ b/server/model_full/Execute/win10_783/startup-console.ps1 @@ -0,0 +1,530 @@ +#!PowerShell + +###################################################################### + +# Function +# CreateTime: 2025-08-06 12:52:28 +# Author: Yue Jiajun +# Version: 0.0.68 + +# Write-Host 是否输出 +# false: 打包成 exe 时,需要设置为 false +# true: 直接运行 ps1时,可以为 true +$outputWriteHost = $true +$outputLogFile = "$MAIN_PATH\startup.log" +$outputErrorFile = "$MAIN_PATH\error.log" +###################################################################### + +# Get current path +$MAIN_PATH = Get-Location + +# Get database service name +$SERVER_NAME = $env:X_MANAGE_DB_SC + +# Nginx executable name +$NGINX_EXE = "model-web.exe" + + +# Log recording function +function Write-Log { + param ( + [string]$message + ) + $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + $logMessage = "[$timestamp] $message" + # [debug] + # Write-Output $logMessage | Out-File -FilePath $logFile -Append + Write-Host $logMessage +} + +function randomText { + $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'.ToCharArray() + $length = 12 + $random = New-Object System.Random + $string = -join (1..$length | ForEach-Object { $chars[$random.Next(0, $chars.Length)] }) + return $string +} + +function Import-Script { + param ( + [string]$dbServer, + [string]$dbPort, + [string]$dbUser, + [string]$dbPassword + ) + # Check whether the script folder exists in the current path + if (Test-Path -Path ".\script" -PathType Container) { + Write-Log "Found script folder, starting to process .." + + # Get all subfolders + $subFolders = Get-ChildItem -Path ".\script" -Directory + + if ($subFolders.Count -eq 0) { + Write-Log "There are no subfolders in the script folder, skipping processing." + exit + } + + # Traverse each subfolder + foreach ($folder in $subFolders) { + Write-Log "Database connection parameters - Please modify according to the actual situation $($folder.Name)" + + # Get all RAR files under this folder + $rarFiles = Get-ChildItem -Path $folder.FullName -Filter "*.rar" + + if ($rarFiles.Count -eq 0) { + Write-Log "There are no SQL files in the folder $($folder.Name), skipping." + continue + } + + # Process each SQL file + foreach ($rarFile in $rarFiles) { + Write-Log "Processing file: $($rarFile.Name) (located in $($folder.Name))" + + $rarName = $rarFile.BaseName + $rarDirectoryName = (Get-Item $rarFile.FullName).DirectoryName + try { + Start-Process -FilePath "rar" -ArgumentList "x -pshzyh!234 `"$($rarFile.FullName)`" `"$rarDirectoryName`"" -NoNewWindow -Wait + + # Remove rar-file + if (Test-Path $rarFile.FullName) { + Remove-Item $rarFile.FullName -Force + # [debug] + # Write-Log "File deleted." + } else { + # [debug] + # Write-Log "File does not exist." + } + } + catch { + Write-Log "Error unrar $($rarFile.Name):$_" + } + } + } + + # Traverse each subfolder + foreach ($folder in $subFolders) { + Write-Log "Database connection parameters - Please modify according to the actual situation $($folder.Name)" + + # Get all SQL files under this folder + $sqlFiles = Get-ChildItem -Path $folder.FullName -Filter "*.sql" + + if ($sqlFiles.Count -eq 0) { + Write-Log "There are no SQL files in the folder $($folder.Name), skipping." + continue + } + + # Process each SQL file + foreach ($sqlFile in $sqlFiles) { + Write-Log "Processing file: $($sqlFile.Name) (located in $($folder.Name))" + + # Use file name as database name (without extension) + $dbName = $sqlFile.BaseName + try { + # Connect to the database and execute SQL files + Write-Log "Creating database $dbName and importing $($sqlFile.Name)" + + # Here we use MySQL client as an example. If it is SQL Server, please modify it to the corresponding command + # For SQL Server, you can use sqlcmd or Invoke sqlcmd + # $command = "mysql -h$dbServer -u$dbUser -p$dbPassword -P$dbPort -e 'CREATE DATABASE IF NOT EXISTS $dbName;'" + # Invoke-Expression $command + + # $command = "mysql -h$dbServer -u$dbUser -p$dbPassword -P$dbPort $dbName `< `"$($sqlFile.FullName)`"" + $command = "mysql -h$dbServer -u$dbUser -p$dbPassword -P$dbPort $($folder.Name) `< `"$($sqlFile.FullName)`"" + + # [debug] + # Write-Log $command + + # Invoke-Expression $command # ERROR + # cmd /c $command # SUCCESS, WARN: >> CategoryInfo: NotSpecified: (mysql: [Warning...an be insecure.:String) [], RemoteException + # Get-Content $sqlFile.FullName | Invoke-Expression $command # ERROR + Start-Process -FilePath "mysql" -ArgumentList "-h$dbServer -u$dbUser -p$dbPassword -P$dbPort $($folder.Name)" -RedirectStandardInput $sqlFile.FullName -NoNewWindow -Wait + + # Write-Log "Successfully imported $($sqlFile.Name) into database $dbName" + Write-Log "Successfully imported $($sqlFile.Name) into database $($folder.Name)" + + $date = $(Get-Date -Format "yyyy-MM-dd") + $random = randomText + $target = ".\patch\$($date)" + New-Item -Path "$target" -ItemType Directory -Force + # cmd /c rar a -pPassword -hp "target.rar" "file" + # Start-Process -FilePath "rar" -ArgumentList "a -pPassword -hp "target.rar" "file"" -NoNewWindow -Wait + # Start-Process -FilePath "rar" -ArgumentList 'a', '-pPassword', '-hpPassword', 'target.rar', 'file' -NoNewWindow -Wait + Start-Process -FilePath "rar" -ArgumentList "a -pPassword#20250810! -hp $target\$($random).rar `"$($sqlFile.FullName)`"" -NoNewWindow -Wait + + # Remove script-file + if (Test-Path $sqlFile.FullName) { + Remove-Item $sqlFile.FullName -Force + # [debug] + # Write-Log "File deleted." + } else { + # [debug] + # Write-Log "File does not exist." + } + } + catch { + Write-Log "Error importing $($sqlFile.Name):$_" + } + } + } + + Write-Log "All script processing has been completed." + } +} + + +function Append-Utf8NoBomContent { + param ( + [Parameter(Mandatory=$true)] + [string]$FilePath, + + [Parameter(Mandatory=$true)] + [string]$Content + ) + + # 确保目录存在,如果不存在则创建 + $directory = [System.IO.Path]::GetDirectoryName($FilePath) + if (-not [System.IO.Directory]::Exists($directory)) { + New-Item -ItemType Directory -Path $directory -Force | Out-Null + } + + # 使用 UTF-8(无 BOM)追加内容 + # 需要PowerShell 6+ + # $Content | Out-File -FilePath $FilePath -Append -Encoding utf8NoBOM + + # 检查文件是否存在,如果不存在则先创建一个空文件(避免 BOM 问题) + if (-not (Test-Path -Path $FilePath)) { + # 使用 .NET 创建空文件(无 BOM) + [System.IO.File]::WriteAllText($FilePath, "", [System.Text.Encoding]::UTF8) + } + + # 使用 .NET 方法追加内容(UTF-8 无 BOM) + [System.IO.File]::AppendAllText($FilePath, "$Content`r`n", [System.Text.Encoding]::UTF8) +} + +function Go-Home { + if($outputWriteHost) { + Write-Host "" + Write-Host "Exit ..." + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 任务执行完成" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + Start-Sleep -Seconds 5 + exit 0 +} + +function Usage-MySQL { + if($outputWriteHost) { + Write-Host "ERROR: Please configure value in the system environment variable." + Write-Host "env: - X_MANAGE_DB_EXE" + Write-Host " - X_MANAGE_DB_COF" + Write-Host "skip database" + Write-Host "" + } + pause + Go-Home +} + +function Usage-SpringBoot { + if($outputWriteHost) { + Write-Host "ERROR: Please configure `"JDK_21`" in the system environment variable." + } + pause + Go-Home +} + +function Install-MySQL-Server { + # Check required environment variables + if (-not $env:X_MANAGE_DB_EXE) { + if($outputWriteHost) { + Write-Host "Error: Missing parameter! {X_MANAGE_DB_EXE}" | Out-File "error.log" -Append + } + Usage-MySQL + return + } + + if (-not (Test-Path $env:X_MANAGE_DB_EXE)) { + if($outputWriteHost) { + Write-Host "Error: Missing parameter! {X_MANAGE_DB_EXE}" | Out-File "error.log" -Append + } + Usage-MySQL + return + } + + Write-Host "exe: $($env:X_MANAGE_DB_EXE)" + $DB_EXEC = $env:X_MANAGE_DB_EXE + + if (-not $env:X_MANAGE_DB_COF) { + if($outputWriteHost) { + Write-Host "Error: Missing parameter! {X_MANAGE_DB_COF}" | Out-File "error.log" -Append + } + Usage-MySQL + return + } + + if (-not (Test-Path $env:X_MANAGE_DB_COF)) { + if($outputWriteHost) { + Write-Host "Error: Missing parameter! {X_MANAGE_DB_COF}" | Out-File "error.log" -Append + } + Usage-MySQL + return + } + if($outputWriteHost) { + Write-Host "ini: $($env:X_MANAGE_DB_COF)" + } + $DB_CONF = $env:X_MANAGE_DB_COF + + # Install MySQL service + & $DB_EXEC --install $SERVER_NAME --defaults-file="$DB_CONF" + + # Configure service to start automatically + sc.exe config $SERVER_NAME start= auto + + # Wait for service registration + Start-Sleep -Seconds 1 + + # Start the service + Start-Service -Name $SERVER_NAME + + # Wait for service to start + Start-Sleep -Seconds 1 +} + +function Check-With-Start-MySQL { + # Check if service exists + $service = Get-Service -Name $SERVER_NAME -ErrorAction SilentlyContinue + + if ($service) { + # Service exists, check if running + if ($service.Status -eq "Running") { + if($outputWriteHost) { + Write-Host "database ok." + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 数据已运行..." + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + } else { + # Start the service if not running + if($outputWriteHost) { + Write-Host "start up ..." + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 启动数据库中..." + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + Start-Service -Name $SERVER_NAME + } + } else { + # Install MySQL service + Install-MySQL-Server + } +} + +function Check-Web { + # 检查 + +} + +function Check-SpringBoot { + # 检查 JDK_21 环境变量 + if (-not $env:JDK_21) { + # 如果不存在,则检查安装目录下是否存在 java 可执行文件 + if (Test-Path "$MAIN_PATH\jre\bin\java.exe") { + $env:JDK_21 = "$MAIN_PATH\jre" + if($outputWriteHost) { + Write-Host "ONESELF" + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - JDK_21 环境变量不存在,默认生效: $env:JDK_21" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + } + } + + if (-not $env:JDK_21) { + Usage-SpringBoot + return + } + + # 检查连接 DB 的 IP 地址 + if (-not $env:MODEL_MANAGE_DB_SERVER) { + # 不存在,则默认 127 + $env:MODEL_MANAGE_DB_SERVER = "127.0.0.1" + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - MODEL_MANAGE_DB_SERVER 环境变量不存在,默认生效: $env:MODEL_MANAGE_DB_SERVER" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + } + + # 检查连接 DB 的端口号 + if (-not $env:MODEL_MANAGE_DB_PORT) { + # 不存在,则默认 3306 + $env:MODEL_MANAGE_DB_PORT = "3306" + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - MODEL_MANAGE_DB_PORT 环境变量不存在,默认生效: $env:MODEL_MANAGE_DB_PORT" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + } + + # 检查 SpringBoot 启动 jar 文件环境变量 + if (-not $env:MODEL_MANAGE_BIN) { + # 不存在,则默认安装目录下 bin + $env:MODEL_MANAGE_BIN = "$MAIN_PATH\bin\demo-0.0.1.jar" + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - MODEL_MANAGE_BIN 环境变量不存在,默认生效: $env:MODEL_MANAGE_BIN" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + if (-not $env:MODEL_MANAGE_BIN) { + if($outputWriteHost) { + Write-Host "ERROR: Missing executable jar" + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 缺少可执行的 jar" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + pause + Go-Home + } + } + + if($outputWriteHost) { + Write-Host "jdk ok." + Write-Host "" + } + Start-Sleep -Seconds 1 + +} + +function Start-Web { + + # 进入 web 下 + Set-Location "$MAIN_PATH\web" + if($outputWriteHost) { + Write-Host "Start Web ..." + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 准备Web启动..." + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + + # Kill existing web service processes + Get-Process -Name $NGINX_EXE.Replace(".exe", "") -ErrorAction SilentlyContinue | Stop-Process -Force + + # 配置默认启动参数 + $NGINX_PATH = $NGINX_EXE + if (-not $NGINX_PATH) { + # 不存在,则默认安装目录下 nginx.exe + # $NGINX_PATH = "$MAIN_PATH\nginx.exe" + $NGINX_PATH = "nginx.exe" + if (-not $NGINX_PATH) { + if($outputWriteHost) { + Write-Host "ERROR: Missing executable web." + } + pause + Go-Home + } + } + if($outputWriteHost) { + Write-Host "$NGINX_PATH" + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Web生效可执行器: $NGINX_PATH" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + + # 检查 Nginx 配置文件是否存在,优先使用 web.conf + # $NGINX_CONFIG = "$MAIN_PATH\conf\web.conf" + $NGINX_CONFIG = "conf\web.conf" + if (-not $NGINX_CONFIG) { + # 不存在,则默认安装目录下 nginx.conf + # $NGINX_CONFIG = "$MAIN_PATH\conf\nginx.conf" + $NGINX_CONFIG = "conf\nginx.conf" + if (-not $NGINX_CONFIG) { + if($outputWriteHost) { + Write-Host "ERROR: Missing web config" + } + pause + Go-Home + } + } + if($outputWriteHost) { + Write-Host "$NGINX_CONFIG" + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Web配置生效文件: $NGINX_CONFIG" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + + # 创建以管理员身份运行的 VBS脚本(类似于原始的批处理方式) + $vbsContent = @" +Set UAC = CreateObject("Shell.Application") +Set WshShell = CreateObject("WScript.Shell") + +On Error Resume Next +Set fso = CreateObject("Scripting.FileSystemObject") +Set tempFile = fso.OpenTextFile("%SystemRoot%\System32\config\systemprofile", 1) +If Err.Number = 0 Then + WshShell.Run "$NGINX_PATH -c $NGINX_CONFIG", 0, False +Else + UAC.ShellExecute "$NGINX_PATH", "-c $NGINX_CONFIG", "", "runas", 0 +End If +"@ + + # 以 UTF-8 写入文件 temp.vbs ,vbs 脚本不能使用 utf-8 + # $vbsContent | Out-File -FilePath "$MAIN_PATH\web\temp.vbs" -Encoding UTF8 + # 以 ANSI 写入文件 temp.vbs + $vbsContent | Out-File -FilePath "$MAIN_PATH\web\temp.vbs" -Encoding ASCII + if($outputWriteHost) { + Write-Host "Build temporary startup script web." + } + + # 运行 vbs 并等待结束 + # Start-Process "cscript.exe" -ArgumentList "//nologo temp.vbs" -Wait + + # 不等待,执行下一条命令,Nginx 本身是持续性窗口,等待会导致阻塞 + Start-Process "cscript.exe" -ArgumentList "//nologo temp.vbs" + + # 等待1秒后(防止上一条执行慢),删除临时文件 + Start-Sleep -Seconds 1 + Remove-Item "temp.vbs" -Force + +} + +function Start-SpringBoot { + + # 准备启动后台服务 + Set-Location $MAIN_PATH + if($outputWriteHost) { + Write-Host "Start Server ..." + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 准备SpringBoot启动..." + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + + # jvm启动参数 + # 指定环境变量 MODEL_MANAGE_DB_SERVER + # 指定环境变量 MODEL_MANAGE_DB_PORT + # 追加自定义JVM参数 MODEL_VM_PARAMS + $arguments = "-Dspring.profiles.active=dev,mysql -Dmybatis-flex.datasource.ds1.password=Wfbke8!LeMY5Fwwe -Dproject.database-ip=$env:MODEL_MANAGE_DB_SERVER -Dproject.database-port=$env:MODEL_MANAGE_DB_PORT $env:MODEL_VM_PARAMS" + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 启动JVM参数: $arguments" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + + # 拆分参数为数组 + $argumentList = $arguments -split " -" + + # 处理第一个元素(没有前导"-")和其余元素(添加前导"-") + $argumentList = @($argumentList[0]) + ($argumentList[1..($argumentList.Length-1)] | ForEach-Object { "-$_" }) + + # 构建最终的调用命令 + if($outputWriteHost) { + # Write-Host "$($env:JDK_21)\bin\java.exe" $argumentList -jar "$env:MODEL_MANAGE_BIN" + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 启动完整命令: $($env:JDK_21)\bin\java.exe $argumentList -jar $env:MODEL_MANAGE_BIN" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + + # 启动 SpringBoot + & "$($env:JDK_21)\bin\java.exe" $argumentList -jar "$env:MODEL_MANAGE_BIN" + +} + + +# 检查并启动 MySQL 数据库 +Check-With-Start-MySQL + +Start-Sleep -Seconds 2 +# 导入数据 +Import-Script "127.0.0.1" "33306" "root" "Root@2025" + +Start-Sleep -Seconds 1 +# 检查 Web 运行环境 +Check-Web +# 启动 Nginx 服务 +Start-Web + +Start-Sleep -Seconds 1 +# 检查 SpringBoot 运行环境 +Check-SpringBoot +# 启动 SpringBoot 服务 +Start-SpringBoot + +Write-Host "已启动模型" +Start-Sleep -Seconds 3 diff --git a/server/model_full/Execute/win10_783/startup.ps1 b/server/model_full/Execute/win10_783/startup.ps1 new file mode 100644 index 0000000..233f62b --- /dev/null +++ b/server/model_full/Execute/win10_783/startup.ps1 @@ -0,0 +1,488 @@ +#!PowerShell + +###################################################################### + +# Function +# CreateTime: 2025-08-06 12:52:28 +# Author: Yue Jiajun +# Version: 0.1.8 + +# Write-Host 是否输出 +# false: 打包成 exe 时,需要设置为 false +# true: 直接运行 ps1时,可以为 true +$outputWriteHost = $false +$outputLogFile = "$MAIN_PATH\startup.log" +$outputErrorFile = "$MAIN_PATH\error.log" +###################################################################### + +# Get current path +$MAIN_PATH = Get-Location + +# Get database service name +$SERVER_NAME = $env:X_MANAGE_DB_SC + +# Nginx executable name +$NGINX_EXE = "model-web.exe" + +function Append-Utf8NoBomContent { + param ( + [Parameter(Mandatory=$true)] + [string]$FilePath, + [Parameter(Mandatory=$true)] + [string]$Content + ) + + $directory = [System.IO.Path]::GetDirectoryName($FilePath) + if (-not [System.IO.Directory]::Exists($directory)) { + New-Item -ItemType Directory -Path $directory -Force | Out-Null + } + + if (-not (Test-Path -Path $FilePath)) { + [System.IO.File]::WriteAllText($FilePath, "", [System.Text.Encoding]::UTF8) + } + [System.IO.File]::AppendAllText($FilePath, "$Content`r`n", [System.Text.Encoding]::UTF8) +} + +function Import-Script { + param ( + [string]$dbServer, + [string]$dbPort, + [string]$dbUser, + [string]$dbPassword + ) + # Check whether the script folder exists in the current path + if (Test-Path -Path ".\script" -PathType Container) { + Write-Log "Found script folder, starting to process .." + + # Get all subfolders + $subFolders = Get-ChildItem -Path ".\script" -Directory + + if ($subFolders.Count -eq 0) { + Write-Log "There are no subfolders in the script folder, skipping processing." + exit + } + + # Traverse each subfolder + foreach ($folder in $subFolders) { + Write-Log "Database connection parameters - Please modify according to the actual situation $($folder.Name)" + + # Get all RAR files under this folder + $rarFiles = Get-ChildItem -Path $folder.FullName -Filter "*.rar" + + if ($rarFiles.Count -eq 0) { + Write-Log "There are no SQL files in the folder $($folder.Name), skipping." + continue + } + + # Process each SQL file + foreach ($rarFile in $rarFiles) { + Write-Log "Processing file: $($rarFile.Name) (located in $($folder.Name))" + + $rarName = $rarFile.BaseName + $rarDirectoryName = (Get-Item $rarFile.FullName).DirectoryName + try { + Start-Process -FilePath "rar" -ArgumentList "x -pshzyh!234 `"$($rarFile.FullName)`" `"$rarDirectoryName`"" -NoNewWindow -Wait + + # Remove rar-file + if (Test-Path $rarFile.FullName) { + Remove-Item $rarFile.FullName -Force + # [debug] + # Write-Log "File deleted." + } else { + # [debug] + # Write-Log "File does not exist." + } + } + catch { + Write-Log "Error unrar $($rarFile.Name):$_" + } + } + } + + # Traverse each subfolder + foreach ($folder in $subFolders) { + Write-Log "Database connection parameters - Please modify according to the actual situation $($folder.Name)" + + # Get all SQL files under this folder + $sqlFiles = Get-ChildItem -Path $folder.FullName -Filter "*.sql" + + if ($sqlFiles.Count -eq 0) { + Write-Log "There are no SQL files in the folder $($folder.Name), skipping." + continue + } + + # Process each SQL file + foreach ($sqlFile in $sqlFiles) { + Write-Log "Processing file: $($sqlFile.Name) (located in $($folder.Name))" + + # Use file name as database name (without extension) + $dbName = $sqlFile.BaseName + try { + # Connect to the database and execute SQL files + Write-Log "Creating database $dbName and importing $($sqlFile.Name)" + + # Here we use MySQL client as an example. If it is SQL Server, please modify it to the corresponding command + # For SQL Server, you can use sqlcmd or Invoke sqlcmd + # $command = "mysql -h$dbServer -u$dbUser -p$dbPassword -P$dbPort -e 'CREATE DATABASE IF NOT EXISTS $dbName;'" + # Invoke-Expression $command + + # $command = "mysql -h$dbServer -u$dbUser -p$dbPassword -P$dbPort $dbName `< `"$($sqlFile.FullName)`"" + $command = "mysql -h$dbServer -u$dbUser -p$dbPassword -P$dbPort $($folder.Name) `< `"$($sqlFile.FullName)`"" + + # [debug] + # Write-Log $command + + # Invoke-Expression $command # ERROR + # cmd /c $command # SUCCESS, WARN: >> CategoryInfo: NotSpecified: (mysql: [Warning...an be insecure.:String) [], RemoteException + # Get-Content $sqlFile.FullName | Invoke-Expression $command # ERROR + Start-Process -FilePath "mysql" -ArgumentList "-h$dbServer -u$dbUser -p$dbPassword -P$dbPort $($folder.Name)" -RedirectStandardInput $sqlFile.FullName -NoNewWindow -Wait + + # Write-Log "Successfully imported $($sqlFile.Name) into database $dbName" + Write-Log "Successfully imported $($sqlFile.Name) into database $($folder.Name)" + + $date = $(Get-Date -Format "yyyy-MM-dd") + $random = randomText + $target = ".\patch\$($date)" + New-Item -Path "$target" -ItemType Directory -Force + # cmd /c rar a -pPassword -hp "target.rar" "file" + # Start-Process -FilePath "rar" -ArgumentList "a -pPassword -hp "target.rar" "file"" -NoNewWindow -Wait + # Start-Process -FilePath "rar" -ArgumentList 'a', '-pPassword', '-hpPassword', 'target.rar', 'file' -NoNewWindow -Wait + Start-Process -FilePath "rar" -ArgumentList "a -pPassword#20250810! -hp $target\$($random).rar `"$($sqlFile.FullName)`"" -NoNewWindow -Wait + + # Remove script-file + if (Test-Path $sqlFile.FullName) { + Remove-Item $sqlFile.FullName -Force + # [debug] + # Write-Log "File deleted." + } else { + # [debug] + # Write-Log "File does not exist." + } + } + catch { + Write-Log "Error importing $($sqlFile.Name):$_" + } + } + } + + Write-Log "All script processing has been completed." + } +} + +function Go-Home { + if($outputWriteHost) { + Write-Host "" + Write-Host "Exit ..." + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 任务执行完成" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + Start-Sleep -Seconds 5 + exit 0 +} + +function Usage-MySQL { + if($outputWriteHost) { + Write-Host "ERROR: Please configure value in the system environment variable." + Write-Host "env: - X_MANAGE_DB_EXE" + Write-Host " - X_MANAGE_DB_COF" + Write-Host "skip database" + Write-Host "" + } + pause + Go-Home +} + +function Usage-SpringBoot { + if($outputWriteHost) { + Write-Host "ERROR: Please configure `"JDK_21`" in the system environment variable." + } + pause + Go-Home +} + +function Install-MySQL-Server { + # Check required environment variables + if (-not $env:X_MANAGE_DB_EXE) { + if($outputWriteHost) { + Write-Host "Error: Missing parameter! {X_MANAGE_DB_EXE}" | Out-File "error.log" -Append + } + Usage-MySQL + return + } + + if (-not (Test-Path $env:X_MANAGE_DB_EXE)) { + if($outputWriteHost) { + Write-Host "Error: Missing parameter! {X_MANAGE_DB_EXE}" | Out-File "error.log" -Append + } + Usage-MySQL + return + } + + Write-Host "exe: $($env:X_MANAGE_DB_EXE)" + $DB_EXEC = $env:X_MANAGE_DB_EXE + + if (-not $env:X_MANAGE_DB_COF) { + if($outputWriteHost) { + Write-Host "Error: Missing parameter! {X_MANAGE_DB_COF}" | Out-File "error.log" -Append + } + Usage-MySQL + return + } + + if (-not (Test-Path $env:X_MANAGE_DB_COF)) { + if($outputWriteHost) { + Write-Host "Error: Missing parameter! {X_MANAGE_DB_COF}" | Out-File "error.log" -Append + } + Usage-MySQL + return + } + if($outputWriteHost) { + Write-Host "ini: $($env:X_MANAGE_DB_COF)" + } + $DB_CONF = $env:X_MANAGE_DB_COF + + # Install MySQL service + & $DB_EXEC --install $SERVER_NAME --defaults-file="$DB_CONF" + + # Configure service to start automatically + sc.exe config $SERVER_NAME start= auto + + # Wait for service registration + Start-Sleep -Seconds 1 + + # Start the service + Start-Service -Name $SERVER_NAME + + # Wait for service to start + Start-Sleep -Seconds 1 +} + +function Check-With-Start-MySQL { + # Check if service exists + $service = Get-Service -Name $SERVER_NAME -ErrorAction SilentlyContinue + + if ($service) { + # Service exists, check if running + if ($service.Status -eq "Running") { + if($outputWriteHost) { + Write-Host "database ok." + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 数据已运行..." + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + } else { + # Start the service if not running + if($outputWriteHost) { + Write-Host "start up ..." + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 启动数据库中..." + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + Start-Service -Name $SERVER_NAME + } + } else { + # Install MySQL service + Install-MySQL-Server + } +} + +function Check-Web { + # 检查 + +} + +function Check-SpringBoot { + if (-not $env:JDK_21) { + if (Test-Path "$MAIN_PATH\jre\bin\java.exe") { + $env:JDK_21 = "$MAIN_PATH\jre" + if($outputWriteHost) { + Write-Host "ONESELF" + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - JDK_21 环境变量不存在,默认生效: $env:JDK_21" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + } + } + + if (-not $env:JDK_21) { + Usage-SpringBoot + return + } + + if (-not $env:MODEL_MANAGE_DB_SERVER) { + $env:MODEL_MANAGE_DB_SERVER = "127.0.0.1" + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - MODEL_MANAGE_DB_SERVER 环境变量不存在,默认生效: $env:MODEL_MANAGE_DB_SERVER" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + } + + if (-not $env:MODEL_MANAGE_DB_PORT) { + $env:MODEL_MANAGE_DB_PORT = "3306" + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - MODEL_MANAGE_DB_PORT 环境变量不存在,默认生效: $env:MODEL_MANAGE_DB_PORT" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + } + + if (-not $env:MODEL_MANAGE_BIN) { + $env:MODEL_MANAGE_BIN = "$MAIN_PATH\bin\demo-0.0.1.jar" + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - MODEL_MANAGE_BIN 环境变量不存在,默认生效: $env:MODEL_MANAGE_BIN" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + if (-not $env:MODEL_MANAGE_BIN) { + if($outputWriteHost) { + Write-Host "ERROR: Missing executable jar" + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 缺少可执行的 jar" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + pause + Go-Home + } + } + + if($outputWriteHost) { + Write-Host "jdk ok." + Write-Host "" + } + Start-Sleep -Seconds 1 + +} + +function Start-Web { + + Set-Location "$MAIN_PATH\web" + if($outputWriteHost) { + Write-Host "Start Web ..." + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 准备Web启动..." + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + + Get-Process -Name $NGINX_EXE.Replace(".exe", "") -ErrorAction SilentlyContinue | Stop-Process -Force + + $NGINX_PATH = $NGINX_EXE + if (-not $NGINX_PATH) { + # $NGINX_PATH = "$MAIN_PATH\nginx.exe" + $NGINX_PATH = "nginx.exe" + if (-not $NGINX_PATH) { + if($outputWriteHost) { + Write-Host "ERROR: Missing executable web." + } + pause + Go-Home + } + } + if($outputWriteHost) { + Write-Host "$NGINX_PATH" + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Web生效可执行器: $NGINX_PATH" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + + # $NGINX_CONFIG = "$MAIN_PATH\conf\web.conf" + $NGINX_CONFIG = "conf\web.conf" + if (-not $NGINX_CONFIG) { + # $NGINX_CONFIG = "$MAIN_PATH\conf\nginx.conf" + $NGINX_CONFIG = "conf\nginx.conf" + if (-not $NGINX_CONFIG) { + if($outputWriteHost) { + Write-Host "ERROR: Missing web config" + } + pause + Go-Home + } + } + if($outputWriteHost) { + Write-Host "$NGINX_CONFIG" + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Web配置生效文件: $NGINX_CONFIG" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + + $vbsContent = @" +Set UAC = CreateObject("Shell.Application") +Set WshShell = CreateObject("WScript.Shell") + +On Error Resume Next +Set fso = CreateObject("Scripting.FileSystemObject") +Set tempFile = fso.OpenTextFile("%SystemRoot%\System32\config\systemprofile", 1) +If Err.Number = 0 Then + WshShell.Run "$NGINX_PATH -c $NGINX_CONFIG", 0, False +Else + UAC.ShellExecute "$NGINX_PATH", "-c $NGINX_CONFIG", "", "runas", 0 +End If +"@ + + # 以 ANSI 写入文件 temp.vbs,vbs 脚本不能使用 utf-8 + $vbsContent | Out-File -FilePath "$MAIN_PATH\web\temp.vbs" -Encoding ASCII + if($outputWriteHost) { + Write-Host "Build temporary startup script web." + } + + # 运行 vbs 并等待结束 + # Start-Process "cscript.exe" -ArgumentList "//nologo temp.vbs" -Wait + + # 不等待,执行下一条命令,Nginx 本身是持续性窗口,等待会导致阻塞 + Start-Process "cscript.exe" -ArgumentList "//nologo temp.vbs" + + Start-Sleep -Seconds 1 + Remove-Item "temp.vbs" -Force + +} + +function Start-SpringBoot { + + # 准备启动后台服务 + Set-Location $MAIN_PATH + if($outputWriteHost) { + Write-Host "Start Server ..." + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 准备SpringBoot启动..." + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + + # jvm启动参数 + # 指定环境变量 MODEL_MANAGE_DB_SERVER + # 指定环境变量 MODEL_MANAGE_DB_PORT + # 追加自定义JVM参数 MODEL_VM_PARAMS + $arguments = "-Dspring.profiles.active=dev,mysql -Dmybatis-flex.datasource.ds1.password=Wfbke8!LeMY5Fwwe -Dproject.database-ip=$env:MODEL_MANAGE_DB_SERVER -Dproject.database-port=$env:MODEL_MANAGE_DB_PORT $env:MODEL_VM_PARAMS" + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 启动JVM参数: $arguments" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + $argumentList = $arguments -split " -" + $argumentList = @($argumentList[0]) + ($argumentList[1..($argumentList.Length-1)] | ForEach-Object { "-$_" }) + if($outputWriteHost) { + Write-Host "$($env:JDK_21)\bin\java.exe" $argumentList -jar "$env:MODEL_MANAGE_BIN" + } + $logMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 启动完整命令: $($env:JDK_21)\bin\java.exe $argumentList -jar $env:MODEL_MANAGE_BIN" + Append-Utf8NoBomContent -FilePath $outputLogFile -Content $logMessage + + # 启动 SpringBoot + $argumentList += "-jar" + $argumentList += "`"$env:MODEL_MANAGE_BIN`"" + $process = Start-Process ` + -FilePath "$($env:JDK_21)\bin\java.exe" ` + -ArgumentList $argumentList ` + -WindowStyle Hidden ` + -RedirectStandardOutput "NUL" ` + -RedirectStandardError "NUL_ERR" ` + -PassThru + + if ($process) { + Write-Host "进程已启动,PID: $($process.Id)" + } else { + Write-Host "进程启动失败!" + } + +} + + +# 检查并启动 MySQL 数据库 +Check-With-Start-MySQL + +Start-Sleep -Seconds 2 +# 导入数据 +Import-Script "127.0.0.1" "33306" "root" "Root@2025" + +Start-Sleep -Seconds 1 +# 检查 Web 运行环境 +Check-Web +# 启动 Nginx 服务 +Start-Web + +Start-Sleep -Seconds 1 +# 检查 SpringBoot 运行环境 +Check-SpringBoot +# 启动 SpringBoot 服务 +Start-SpringBoot + +Write-Host "已启动模型" +Start-Sleep -Seconds 3