Compare commits
13 Commits
01f87138cc
...
6f9010bbc7
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6f9010bbc7 | ||
![]() |
66de4ce4c4 | ||
![]() |
f9663b8e3f | ||
![]() |
fc9108689f | ||
![]() |
ec815836fa | ||
![]() |
d302a01b47 | ||
![]() |
17fa31fe78 | ||
![]() |
32a0d9720c | ||
![]() |
f1761fa2be | ||
![]() |
441b56f540 | ||
![]() |
c99cc17536 | ||
![]() |
046da79838 | ||
![]() |
076b1e6ef4 |
@ -1 +1 @@
|
||||
dev/public/test
|
||||
dev/public/test/prod/script
|
6
base/Resources/io/config/credentials.jsonl
Normal file
6
base/Resources/io/config/credentials.jsonl
Normal file
@ -0,0 +1,6 @@
|
||||
{"url":"http://192.168.1.103:9001/api/v1/service-account-credentials","accessKey":"lXSrqEcAVohPNXduJopS","secretKey":"QOGRA7J20DX4hkVZ9zxKzT2LIDyJVANDn50jR44r","api":"s3v4","path":"auto"}
|
||||
{"url":"http://192.168.1.103:9001/api/v1/service-account-credentials","accessKey":"TS5qkfrzPWUMGAwpHMYZ","secretKey":"oMOGshNWfdWH9DwxnK5G9ZFfGIUuwrNjvQ2glKbP","api":"s3v4","path":"auto"}
|
||||
{"url":"http://192.168.1.103:9001/api/v1/service-account-credentials","accessKey":"H9Ttfrb5cyvWhpmfWJZE","secretKey":"bScymo0XStmWbg2ESWzaWDKxljfMBwGttfEJgabb","api":"s3v4","path":"auto"}
|
||||
{"url":"http://192.168.1.103:9001/api/v1/service-account-credentials","accessKey":"G5PoLrqEkU6GcLgFJmpi","secretKey":"TikSw6F3BAezJhFZOBTaoK0kqjihID4jDfXI6Wyr","api":"s3v4","path":"auto"}
|
||||
{"url":"http://192.168.1.103:9001/api/v1/service-account-credentials","accessKey":"d4aYukalXedyXxkzG9GG","secretKey":"ZwUnm4YcnNdOMJSxnaY8gnHUjCN367C3fVaDxCnm","api":"s3v4","path":"auto"}
|
||||
{"url":"http://192.168.1.103:9001/api/v1/service-account-credentials","accessKey":"V8UDKIII9ynU6MPGteUZ","secretKey":"AG97879uLMpfYxOYfcTyfAqyCEE9Lx63QNRQLseP","api":"s3v4","path":"auto"}
|
@ -3,3 +3,4 @@ TS5qkfrzPWUMGAwpHMYZ/oMOGshNWfdWH9DwxnK5G9ZFfGIUuwrNjvQ2glKbP
|
||||
H9Ttfrb5cyvWhpmfWJZE/bScymo0XStmWbg2ESWzaWDKxljfMBwGttfEJgabb
|
||||
G5PoLrqEkU6GcLgFJmpi/TikSw6F3BAezJhFZOBTaoK0kqjihID4jDfXI6Wyr
|
||||
d4aYukalXedyXxkzG9GG/ZwUnm4YcnNdOMJSxnaY8gnHUjCN367C3fVaDxCnm
|
||||
V8UDKIII9ynU6MPGteUZ/AG97879uLMpfYxOYfcTyfAqyCEE9Lx63QNRQLseP
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1 +1 @@
|
||||
{"version":"1","format":"xl-single","id":"970d54f5-cd3a-4ba7-9555-842c26c4ea8c","xl":{"version":"3","this":"8cf766e8-1cac-4207-bab4-578c892b6500","sets":[["8cf766e8-1cac-4207-bab4-578c892b6500"]],"distributionAlgo":"SIPMOD+PARITY"}}
|
||||
{"version":"1","format":"xl-single","id":"3c817b22-670f-444e-9758-176660256085","xl":{"version":"3","this":"af4a619d-76c7-4025-9beb-b16ebe59fd41","sets":[["af4a619d-76c7-4025-9beb-b16ebe59fd41"]],"distributionAlgo":"SIPMOD+PARITY"}}
|
Binary file not shown.
@ -1,5 +1,5 @@
|
||||
@echo off
|
||||
chcp 65001
|
||||
chcp 65001 >nul
|
||||
title MinIO Quick Start
|
||||
|
||||
set MINIO_EXE=minio.exe
|
||||
|
@ -1,29 +1,77 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
chcp 65001 >nul
|
||||
title Import Data Into MySQL
|
||||
|
||||
:: MySQL 连接配置
|
||||
:: MySQL connection configuration
|
||||
set MYSQL_HOST=127.0.0.1
|
||||
set MYSQL_PORT=33306
|
||||
set MYSQL_USER=root
|
||||
set MYSQL_PASS=Root@2025
|
||||
set MYSQL_EXE=mysql.exe
|
||||
|
||||
:: 脚本目录
|
||||
:: Script directory
|
||||
set SCRIPTS_DIR=script
|
||||
|
||||
:: 遍历 script 目录下的所有文件夹
|
||||
:: 1. Check if mysql.exe exists
|
||||
where %MYSQL_EXE% >nul 2>&1
|
||||
if %errorLevel% neq 0 (
|
||||
echo Error: mysql.exe not found in PATH
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: 2. Check if scripts directory exists
|
||||
if not exist "%SCRIPTS_DIR%" (
|
||||
echo Error: Scripts directory not found at %SCRIPTS_DIR%
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: 3. Verify MySQL connection
|
||||
echo Testing MySQL connection...
|
||||
%MYSQL_EXE% -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASS% -e "SELECT 1" >nul 2>&1
|
||||
if %errorLevel% neq 0 (
|
||||
echo Error: Failed to connect to MySQL server
|
||||
echo Please verify your connection parameters:
|
||||
echo Host: %MYSQL_HOST%
|
||||
echo Port: %MYSQL_PORT%
|
||||
echo User: %MYSQL_USER%
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo MySQL connection successful. Starting import process...
|
||||
|
||||
:: Process all folders in the scripts directory
|
||||
for /d %%D in ("%SCRIPTS_DIR%\*") do (
|
||||
set "folder=%%~nxD"
|
||||
echo 正在处理数据库: !folder!
|
||||
echo Processing database: !folder!
|
||||
|
||||
:: 创建数据库(如果不存在)
|
||||
mysql -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASS% -e "CREATE DATABASE IF NOT EXISTS `!folder!`;"
|
||||
:: Create database (if not exists)
|
||||
echo Creating database '!folder!' if not exists...
|
||||
%MYSQL_EXE% -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASS% -e "CREATE DATABASE IF NOT EXISTS `!folder!`;"
|
||||
|
||||
:: 遍历当前文件夹中的所有.sql文件
|
||||
for %%F in ("%%D\*.sql") do (
|
||||
echo 正在导入文件: %%~nxF 到数据库 !folder!
|
||||
mysql -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASS% !folder! < "%%F"
|
||||
)
|
||||
)
|
||||
|
||||
echo 所有SQL文件导入完成
|
||||
if %errorLevel% neq 0 (
|
||||
echo Error: Failed to create database '!folder!'
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: Process all .sql files in the current folder
|
||||
for %%F in ("%%D\*.sql") do (
|
||||
echo Importing file: %%~nxF into database !folder!
|
||||
%MYSQL_EXE% -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASS% !folder! < "%%F"
|
||||
|
||||
if %errorLevel% neq 0 (
|
||||
echo Error: Failed to import file %%~nxF
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
)
|
||||
echo Completed processing database: !folder!
|
||||
echo ----------------------------------------
|
||||
)
|
||||
|
||||
echo All SQL files imported successfully!
|
||||
pause
|
@ -1,16 +1,17 @@
|
||||
@echo off
|
||||
chcp 65001
|
||||
setlocal enabledelayedexpansion
|
||||
chcp 65001 >nul
|
||||
title Initialize And Startup MySQL
|
||||
|
||||
:: 检查是否以管理员身份运行
|
||||
:: Check if running as administrator
|
||||
net session >nul 2>&1
|
||||
if %errorLevel% neq 0 (
|
||||
echo 请使用管理员身份运行此脚本!
|
||||
echo Please run this script as Administrator!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: 配置参数 - 根据你的环境修改这些值
|
||||
:: Configuration parameters - modify these values according to your environment
|
||||
set "MYSQL_HOME=%INSTALLPATH%"
|
||||
set "MYSQL_BIN_PATH=%INSTALLPATH%\bin"
|
||||
set "MYSQLD_PATH=%INSTALLPATH%\bin\mysqld.exe"
|
||||
@ -19,43 +20,95 @@ set "SERVICE_NAME=x_database"
|
||||
set "NEW_ROOT_PASSWORD=Root@2025"
|
||||
set "DATA_DIR=%INSTALLPATH%\data"
|
||||
|
||||
:: 1. 初始化MySQL
|
||||
echo [1/4] 正在初始化MySQL...
|
||||
:: "%MYSQL_BIN_PATH%\mysqld" --defaults-file="%MY_INI_PATH%" --initialize-insecure --basedir="%MYSQL_BIN_PATH%\.." --datadir="%DATA_DIR%"
|
||||
:: 1. Check if mysqld.exe exists
|
||||
if not exist "%MYSQLD_PATH%" (
|
||||
echo Error: mysqld.exe not found at %MYSQLD_PATH%
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: 2. Check if my.ini exists
|
||||
if not exist "%MY_INI_PATH%" (
|
||||
echo Error: Configuration file my.ini not found at %MY_INI_PATH%
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: 3. Check if service already exists
|
||||
sc query "%SERVICE_NAME%" >nul 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
echo Error: Service [%SERVICE_NAME%] already exists
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo "%DATA_DIR%"
|
||||
if exist "%DATA_DIR%" (
|
||||
set "isEmpty=true"
|
||||
dir /a /b "%DATA_DIR%\*" 2>nul | findstr . >nul && set "isEmpty=false"
|
||||
dir /ad /b "%DATA_DIR%\*" 2>nul | findstr . >nul && set "isEmpty=false"
|
||||
if "!isEmpty!"=="false" (
|
||||
echo Please empty the data directory first
|
||||
pause
|
||||
exit /b 1
|
||||
) else (
|
||||
echo Initialization conditions met
|
||||
)
|
||||
) else (
|
||||
echo Initialization conditions met. Proceed with initialization?
|
||||
choice /c yn /m "Enter your choice (Y/N): "
|
||||
if errorlevel 2 (
|
||||
echo User chose not to initialize. Exiting...
|
||||
exit /b 0
|
||||
) else (
|
||||
echo Initializing directory...
|
||||
mkdir "%DATA_DIR%"
|
||||
if exist "%DATA_DIR%" (
|
||||
echo Directory initialized successfully
|
||||
) else (
|
||||
echo Failed to initialize directory
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
:: 1. Initialize MySQL
|
||||
echo [1/4] Initializing MySQL...
|
||||
"%MYSQL_BIN_PATH%\mysqld" --defaults-file="%MY_INI_PATH%" --initialize-insecure --basedir="%MYSQL_HOME%" --datadir="%DATA_DIR%"
|
||||
if errorlevel 1 (
|
||||
echo 初始化失败
|
||||
echo Initialization failed
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: 2. 注册MySQL服务
|
||||
echo [2/4] 正在注册MySQL服务[%SERVICE_NAME%]...
|
||||
:: 2. Register MySQL service
|
||||
echo [2/4] Registering MySQL service [%SERVICE_NAME%]...
|
||||
"%MYSQL_BIN_PATH%\mysqld" --install "%SERVICE_NAME%" --defaults-file="%MY_INI_PATH%"
|
||||
if errorlevel 1 (
|
||||
echo 服务注册失败
|
||||
echo Service registration failed
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: 3. 启动MySQL服务
|
||||
echo [3/4] 正在启动MySQL服务[%SERVICE_NAME%]...
|
||||
:: 3. Start MySQL service
|
||||
echo [3/4] Starting MySQL service [%SERVICE_NAME%]...
|
||||
net start "%SERVICE_NAME%"
|
||||
if errorlevel 1 (
|
||||
echo 服务启动失败
|
||||
echo Service startup failed
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: 4. 修改root密码
|
||||
echo [4/4] 正在修改root密码...
|
||||
:: 4. Change root password
|
||||
echo [4/4] Changing root password...
|
||||
"%MYSQL_BIN_PATH%\mysql" -u root --skip-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '%NEW_ROOT_PASSWORD%'; FLUSH PRIVILEGES;"
|
||||
if errorlevel 1 (
|
||||
echo 密码修改失败
|
||||
echo Password change failed
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo MySQL已成功初始化并配置!
|
||||
echo 服务名称: %SERVICE_NAME%
|
||||
echo Root新密码: %NEW_ROOT_PASSWORD%
|
||||
echo my.ini路径: %MY_INI_PATH%
|
||||
echo MySQL successfully initialized and configured!
|
||||
echo Service name: %SERVICE_NAME%
|
||||
echo New root password: %NEW_ROOT_PASSWORD%
|
||||
echo my.ini path: %MY_INI_PATH%
|
||||
|
||||
pause
|
||||
endlocal
|
@ -1,50 +1,76 @@
|
||||
@echo off
|
||||
chcp 65001
|
||||
setlocal enabledelayedexpansion
|
||||
chcp 65001 >nul
|
||||
title Register MySQL Service
|
||||
|
||||
:: 检查是否以管理员身份运行
|
||||
:: Check if running as administrator
|
||||
net session >nul 2>&1
|
||||
if %errorLevel% neq 0 (
|
||||
echo 请使用管理员身份运行此脚本!
|
||||
echo Please run this script as Administrator!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: Configuration parameters
|
||||
set "SERVICE_NAME=x_database"
|
||||
set "MYSQLD_PATH=mysqld.exe"
|
||||
set "MY_INI_PATH=%INSTALLPATH%\my.ini"
|
||||
|
||||
:: 1. 停止并删除现有MySQL服务
|
||||
echo 正在停止MySQL服务[%SERVICE_NAME%]...
|
||||
:: Verify mysqld.exe exists
|
||||
where %MYSQLD_PATH% >nul 2>&1
|
||||
if %errorLevel% neq 0 (
|
||||
echo Error: mysqld.exe not found in PATH
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: Verify my.ini exists
|
||||
if not exist "%MY_INI_PATH%" (
|
||||
echo Error: Configuration file not found at %MY_INI_PATH%
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: 1. Stop and remove existing MySQL service
|
||||
echo Stopping MySQL service [%SERVICE_NAME%]...
|
||||
net stop %SERVICE_NAME% >nul 2>&1
|
||||
|
||||
echo 正在删除已有的MySQL服务[%SERVICE_NAME%]...
|
||||
echo Removing existing MySQL service [%SERVICE_NAME%]...
|
||||
sc query %SERVICE_NAME% >nul 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
sc delete %SERVICE_NAME% >nul 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
echo [成功] MySQL服务[%SERVICE_NAME%]已删除
|
||||
echo [Success] MySQL service [%SERVICE_NAME%] removed
|
||||
) else (
|
||||
echo [警告] 删除MySQL服务[%SERVICE_NAME%]失败(可能服务不存在)
|
||||
echo [Error] Failed to remove MySQL service [%SERVICE_NAME%]
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
) else (
|
||||
echo [Info] MySQL service [%SERVICE_NAME%] does not exist (no action needed)
|
||||
)
|
||||
|
||||
:: 2. 安装MySQL服务
|
||||
echo 正在安装MySQL服务[%SERVICE_NAME%]...
|
||||
mysqld --install %SERVICE_NAME% --defaults-file="%INSTALLPATH%\my.ini"
|
||||
:: 2. Install MySQL service
|
||||
echo Installing MySQL service [%SERVICE_NAME%]...
|
||||
%MYSQLD_PATH% --install %SERVICE_NAME% --defaults-file="%MY_INI_PATH%"
|
||||
if %errorLevel% equ 0 (
|
||||
echo [成功] MySQL服务[%SERVICE_NAME%]安装完成
|
||||
echo [Success] MySQL service [%SERVICE_NAME%] installed
|
||||
) else (
|
||||
echo [错误] MySQL服务[%SERVICE_NAME%]安装失败
|
||||
echo [Error] Failed to install MySQL service [%SERVICE_NAME%]
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: 3. 启动MySQL服务
|
||||
echo 正在启动MySQL服务[%SERVICE_NAME%]...
|
||||
:: 3. Start MySQL service
|
||||
echo Starting MySQL service [%SERVICE_NAME%]...
|
||||
net start %SERVICE_NAME%
|
||||
if %errorLevel% equ 0 (
|
||||
echo [成功] MySQL服务[%SERVICE_NAME%]已启动
|
||||
echo [Success] MySQL service [%SERVICE_NAME%] started
|
||||
) else (
|
||||
echo [错误] MySQL服务[%SERVICE_NAME%]启动失败
|
||||
echo [Error] Failed to start MySQL service [%SERVICE_NAME%]
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo 所有操作已完成!
|
||||
echo All operations completed successfully!
|
||||
pause
|
@ -1,9 +1,11 @@
|
||||
@echo on
|
||||
@echo off
|
||||
chcp 65001 >nul
|
||||
tital Install Redis Server
|
||||
|
||||
:: 检查是否以管理员身份运行
|
||||
net session >nul 2>&1
|
||||
if %errorLevel% neq 0 (
|
||||
echo 请使用管理员身份运行此脚本!
|
||||
echo Please run this script as Administrator!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
@ -1,6 +1,6 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
chcp 65001
|
||||
chcp 65001 >nul
|
||||
title RocketMQ 5.x Quick Start (with Proxy)
|
||||
|
||||
:: 1. 检查 ROCKETMQ_HOME 是否存在
|
||||
|
@ -62,30 +62,40 @@ Name: "Chinese"; MessagesFile: "compiler:Languages\Chinese.isl";
|
||||
;Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
||||
|
||||
|
||||
;; 程序 ICO
|
||||
[Icons]
|
||||
;Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}.exe"
|
||||
;Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}.exe"; Tasks: desktopicon
|
||||
|
||||
|
||||
;; 组件安装方式
|
||||
[Types]
|
||||
Name: "full"; Description: "完整组件安装";
|
||||
Name: "mini"; Description: "最小安装";
|
||||
;; ============================================== 自定义组件 必须启用 iscustom 作为 Flags ==============================================
|
||||
; iscustom 开启自定义选项
|
||||
Name: "custom"; Description: "自定义组件安装"; Flags: iscustom;
|
||||
|
||||
|
||||
;; 组件列表选择项
|
||||
[Components]
|
||||
;; ============================================== 自定义组件的 Types 可以不参与任何固定式 ==============================================
|
||||
Name: "MainApp"; Description: "{#MyAppName}主程序"; Types: full mini; Flags: checkablealone;
|
||||
Name: "JDK"; Description: "JDK程序"; Types: full custom; Flags: checkablealone;
|
||||
Name: "Redis"; Description: "Redis程序"; Types: full custom; Flags: checkablealone;
|
||||
Name: "MinIO"; Description: "MinIO程序"; Types: full custom; Flags: checkablealone;
|
||||
Name: "RocketMQ"; Description: "RocketMQ程序"; Types: full custom; Flags: checkablealone;
|
||||
Name: "Nginx"; Description: "Nginx程序"; Types: full custom; Flags: checkablealone;
|
||||
Name: "MySQL"; Description: "MySQL程序"; Types: full custom; Flags: checkablealone;
|
||||
Name: "JDK"; Description: "JDK程序"; Types: full; Flags: checkablealone;
|
||||
Name: "Redis"; Description: "Redis程序"; Types: full; Flags: checkablealone;
|
||||
Name: "MinIO"; Description: "MinIO程序"; Types: full; Flags: checkablealone;
|
||||
Name: "RocketMQ"; Description: "RocketMQ程序"; Types: full; Flags: checkablealone;
|
||||
Name: "Nginx"; Description: "Nginx程序"; Types: full; Flags: checkablealone;
|
||||
Name: "MySQL"; Description: "MySQL程序"; Types: full; Flags: checkablealone;
|
||||
|
||||
|
||||
;; 引入文件列表
|
||||
[Files]
|
||||
|
||||
;; ============================================== 共享文件 禁止使用 ignoreversion 作为 Flags ==============================================
|
||||
;; Readme
|
||||
; 安装完的 readme 信息
|
||||
Source: "Resources\Readme.md"; DestDir: "{app}"; Flags: isreadme;
|
||||
;Source: "Resources\Readme.md"; DestDir: "{app}"; Flags: isreadme;
|
||||
;; 文件
|
||||
Source: "Resources\grep.exe"; DestDir: "{app}\usr"; DestName: "grep.exe"; Flags: ignoreversion; Components: MainApp;
|
||||
;; 文件夹
|
||||
@ -107,17 +117,19 @@ Name: "{app}\nginx\dist"; Permissions: users-modify; Components: Nginx;
|
||||
|
||||
;; 安装前后删除文件
|
||||
[InstallDelete]
|
||||
Type: files; Name: "{app}\mysql\template*.bat";
|
||||
Type: files; Name: "{app}\mysql\start-mysql-demo.bat";
|
||||
Type: files; Name: "{app}\mysql\template.ini";
|
||||
;Type: files; Name: "{app}\mysql\template.ini";
|
||||
;Type: files; Name: "{app}\mysql\template-initialize-and-start-mysql.bat";
|
||||
;Type: files; Name: "{app}\mysql\template-register-mysql-with-data.bat";
|
||||
|
||||
|
||||
;; 安装时注册表与环境变量列表
|
||||
[Registry]
|
||||
;; 写入普通注册表项
|
||||
; uninsdeletevalue 卸载时删除值
|
||||
; uninsdeletekey 卸载时删除键
|
||||
; preservestringtype 保留原值类型
|
||||
;; ============================================== Path 禁止使用任何 *delete*、*remove* 作为 Flags 运行 ==============================================
|
||||
|
||||
;; 写入普通注册表项
|
||||
Root: HKLM; Subkey: "Software\X\Command"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Flags: uninsdeletevalue ;
|
||||
Root: HKLM; Subkey: "Software\X\Command"; ValueType: string; ValueName: "Version"; ValueData: "{#SetupSetting("AppVersion")}"; Flags: uninsdeletevalue ;
|
||||
|
||||
@ -131,7 +143,7 @@ Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; Value
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: MainApp; \
|
||||
ValueName: "X_COMMAND"; ValueData: "{app}"; Flags: uninsdeletevalue ;
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; AfterInstall: RefreshEnvironment; Components: MainApp; \
|
||||
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%\usr"; Check: NeedsAddPath('%X_COMMAND%\usr'); Flags: uninsdeletevalue ;
|
||||
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%\usr"; Check: NeedsAddPath('%X_COMMAND%\usr'); Flags: preservestringtype ;
|
||||
|
||||
|
||||
|
||||
@ -147,19 +159,19 @@ Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environmen
|
||||
|
||||
;; 【Redis】追加到 PATH 变量
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; AfterInstall: RefreshEnvironment; Components: Redis; \
|
||||
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%\redis"; Check: NeedsAddPath('%X_COMMAND%\redis'); Flags: uninsdeletevalue ;
|
||||
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%\redis"; Check: NeedsAddPath('%X_COMMAND%\redis'); Flags: preservestringtype ;
|
||||
|
||||
|
||||
|
||||
;; 【MinIO】追加到 PATH 变量
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; AfterInstall: RefreshEnvironment; Components: MinIO; \
|
||||
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%\io"; Check: NeedsAddPath('%X_COMMAND%\io'); Flags: uninsdeletevalue ;
|
||||
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%\io"; Check: NeedsAddPath('%X_COMMAND%\io'); Flags: preservestringtype ;
|
||||
|
||||
|
||||
|
||||
;; 【Nginx】追加到 PATH 变量
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; AfterInstall: RefreshEnvironment; Components: Nginx; \
|
||||
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%\nginx"; Check: NeedsAddPath('%X_COMMAND%\nginx'); Flags: uninsdeletevalue ;
|
||||
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%\nginx"; Check: NeedsAddPath('%X_COMMAND%\nginx'); Flags: preservestringtype ;
|
||||
|
||||
|
||||
|
||||
@ -169,18 +181,18 @@ Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environmen
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: RocketMQ; \
|
||||
ValueName: "ROCKETMQ_SBIN"; ValueData: "{app}\rocketmq\sbin"; Flags: uninsdeletevalue ;
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; AfterInstall: RefreshEnvironment; Components: RocketMQ; \
|
||||
ValueName: "Path"; ValueData: "{olddata};%ROCKETMQ_SBIN%"; Check: NeedsAddPath('%ROCKETMQ_SBIN%'); Flags: uninsdeletevalue ;
|
||||
ValueName: "Path"; ValueData: "{olddata};%ROCKETMQ_SBIN%"; Check: NeedsAddPath('%ROCKETMQ_SBIN%'); Flags: preservestringtype ;
|
||||
|
||||
|
||||
|
||||
;; 【MySQL】环境变量【注册服务使用】
|
||||
; 数据库服务注册后服务名
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: MySQL; \
|
||||
;Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: MySQL; \
|
||||
ValueName: "X_MANAGE_DB_SC"; ValueData: "x_database"; Flags: uninsdeletevalue ;
|
||||
; 这两个值,将作为后续判断程序是否已经安装做依据
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: MySQL; \
|
||||
;Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: MySQL; \
|
||||
ValueName: "X_MANAGE_DB_EXE"; ValueData: "{app}\mysql\bin\mysqld.exe"; Flags: uninsdeletevalue ;
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: MySQL; \
|
||||
;Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: MySQL; \
|
||||
ValueName: "X_MANAGE_DB_COF"; ValueData: "{app}\mysql\my.ini"; Flags: uninsdeletevalue ;
|
||||
|
||||
; MySQL【通用服务】,导入脚本数据使用
|
||||
@ -400,12 +412,18 @@ end;
|
||||
// 在安装完成后执行
|
||||
procedure CurStepChanged(CurStep: TSetupStep);
|
||||
begin
|
||||
// 仅在安装完成后执行
|
||||
if CurStep = ssPostInstall then
|
||||
begin
|
||||
CreateConfigFromTemplate;
|
||||
|
||||
// if UsingWinNT then
|
||||
// Exec('cmd.exe', '/C cmd', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
|
||||
if FileExists(ExpandConstant('{app}\mysql\template.ini')) then
|
||||
DeleteFile(ExpandConstant('{app}\mysql\template.ini'));
|
||||
|
||||
if FileExists(ExpandConstant('{app}\mysql\template-initialize-and-start-mysql.bat')) then
|
||||
DelTree(ExpandConstant('{app}\mysql\template-initialize-and-start-mysql.bat'), False, True, False);
|
||||
if FileExists(ExpandConstant('{app}\mysql\template-register-mysql-with-data.bat')) then
|
||||
DelTree(ExpandConstant('{app}\mysql\template-register-mysql-with-data.bat'), False, True, False);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
0
server/simulation/Execute/Readme.md
Normal file
0
server/simulation/Execute/Readme.md
Normal file
18
server/simulation/Resources/simulation.bat
Normal file
18
server/simulation/Resources/simulation.bat
Normal file
@ -0,0 +1,18 @@
|
||||
@echo off
|
||||
chcp 65001 >nul
|
||||
title Simulation Quick Start
|
||||
|
||||
if exist "%SIMULATION_MANAGE_BIN%" (
|
||||
start "Simulation Server" cmd /k "chcp 65001 && title Simulation Server && java -Dspring.profiles.active=test,mysql,redis,rocketmq,springdoc %SIMULATION_VM_PARAMS% -jar %SIMULATION_MANAGE_BIN%"
|
||||
)
|
||||
|
||||
if exist "%SIMULATION_MANAGE_BIN%" (
|
||||
cd %SIMULATION_MAIN%\web
|
||||
start "Simulation Website" cmd /k "title Simulation Website && simulation-web.exe -c conf/web.conf"
|
||||
)
|
||||
|
||||
echo Simulation:
|
||||
echo - SimulationServer (Port: 28280)
|
||||
echo - SimulationWebsite (Port: 18280)
|
||||
|
||||
pause
|
271
server/simulation/install-win7-simulation.iss
Normal file
271
server/simulation/install-win7-simulation.iss
Normal file
@ -0,0 +1,271 @@
|
||||
;iss
|
||||
|
||||
#define MyAppName "仿真实验"
|
||||
#define MyAppVersion "v1.0.0"
|
||||
#define MyAppPublisher "X"
|
||||
#define MyAppURL "~"
|
||||
#define MyAppExeName "simulation"
|
||||
#define MyAppAssocName MyAppName + " File"
|
||||
#define MyAppAssocExt ".myp"
|
||||
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
|
||||
|
||||
|
||||
|
||||
; 默认配置
|
||||
[Setup]
|
||||
AppId={{550E8400-E29B-41D4-A716-446655440000}
|
||||
; 默认安装路径
|
||||
DefaultDirName={localappdata}\XManage
|
||||
; 安装密码
|
||||
Password=20250813
|
||||
; 是否加密
|
||||
Encryption=yes
|
||||
; ICO图标
|
||||
;SetupIconFile=Resources\icon.ico
|
||||
;UninstallDisplayIcon={app}\{#MyAppExeName}.exe
|
||||
VersionInfoProductVersion=1.0.0
|
||||
VersionInfoCompany=
|
||||
VersionInfoDescription=仿真实验服务
|
||||
VersionInfoCopyright=CopyRight © 2025
|
||||
VersionInfoProductName=仿真实验
|
||||
|
||||
; 默认配置
|
||||
AppName={#MyAppName}
|
||||
AppVersion={#MyAppVersion}
|
||||
AppPublisher={#MyAppPublisher}
|
||||
AppPublisherURL={#MyAppURL}
|
||||
AppSupportURL={#MyAppURL}
|
||||
AppUpdatesURL={#MyAppURL}
|
||||
ChangesAssociations=yes
|
||||
DisableDirPage=no
|
||||
DisableProgramGroupPage=yes
|
||||
Compression=lzma2
|
||||
SolidCompression=yes
|
||||
WizardStyle=modern
|
||||
ChangesEnvironment=yes
|
||||
PrivilegesRequired=admin
|
||||
ArchitecturesAllowed=x64compatible
|
||||
ArchitecturesInstallIn64BitMode=x64compatible
|
||||
OutputDir=Release\
|
||||
OutputBaseFilename=SimulationSetup-{#MyAppVersion}
|
||||
UninstallFilesDir={app}\{#MyAppExeName}
|
||||
UninstallDisplayIcon={app}\{#MyAppExeName}\{#MyAppExeName}.bat
|
||||
|
||||
|
||||
; 语言选择
|
||||
[Languages]
|
||||
Name: "Chinese"; MessagesFile: "compiler:Languages\Chinese.isl"
|
||||
|
||||
|
||||
;; 任务
|
||||
[Tasks]
|
||||
; 是否创建桌面图标
|
||||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
||||
|
||||
|
||||
;; 组件安装方式
|
||||
[Types]
|
||||
; 完整安装所有组件
|
||||
Name: full; Description: 完整组件安装;
|
||||
Name: "mini"; Description: "最小安装";
|
||||
; 自定义安装
|
||||
Name: custom; Description: 自定义安装; Flags: iscustom
|
||||
|
||||
|
||||
;; 组件列表选择项
|
||||
[Components]
|
||||
Name: Starter; Description: {#MyAppName} 启动; Types: full;
|
||||
Name: UI; Description: {#MyAppName} UI; Types: full mini;
|
||||
Name: Server; Description: {#MyAppName} Server; Types: full mini;
|
||||
Name: Data; Description: {#MyAppName} Data; Types: full;
|
||||
|
||||
|
||||
;; 安装包引入文件列表
|
||||
[Files]
|
||||
; 后端工程+启动器
|
||||
;Source: "Resources\{#MyAppExeName}.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter
|
||||
;Source: "Resources\{#MyAppExeName}-console.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter
|
||||
;Source: "Resources\{#MyAppExeName}-x64.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter
|
||||
;Source: "Resources\{#MyAppExeName}-x86.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter
|
||||
;Source: "Resources\patch.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter
|
||||
|
||||
Source: "Resources\{#MyAppExeName}.bat"; DestDir: "{app}\{#MyAppExeName}"; DestName: "{#MyAppExeName}.bat"; Flags: ignoreversion; Components: Starter
|
||||
Source: "Resources\server\demo-0.0.1.jar"; DestDir: "{app}\{#MyAppExeName}\bin"; Flags: ignoreversion; Components: Server
|
||||
|
||||
; 更新数据库脚本
|
||||
Source: "Resources\script\*"; DestDir: "{app}\{#MyAppExeName}\script"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Data
|
||||
|
||||
; 前端工程 + Nginx
|
||||
Source: "Resources\web\*"; DestDir: "{app}\{#MyAppExeName}\web"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Starter;
|
||||
Source: "Resources\dist\*"; DestDir: "{app}\{#MyAppExeName}\web\dist"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: UI;
|
||||
|
||||
|
||||
;; 安装时注册表与环境变量列表
|
||||
[Registry]
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \
|
||||
ValueName: "SIMULATION_MAIN"; ValueData: "{app}\{#MyAppExeName}";
|
||||
; 启动jar
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \
|
||||
ValueName: "SIMULATION_MANAGE_BIN"; ValueData: "{app}\{#MyAppExeName}\bin\demo-0.0.1.jar";
|
||||
; 扩展启动vm变量
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \
|
||||
ValueName: "SIMULATION_VM_PARAMS"; ValueData: " \
|
||||
--enable-preview \
|
||||
-Dserver.port=28280 \
|
||||
-Djasypt.encryptor.password=jwnwfA1pIoLihBptgbR8S6UEEAfGurjG \
|
||||
-Dproject.database-ip=127.0.0.1 \
|
||||
-Dproject.database-port=33306 \
|
||||
-Dproject.database-name=simulation \
|
||||
-Dproject.redis-url=127.0.0.1 \
|
||||
-Dproject.rocketmq-url=127.0.0.1:8081 \
|
||||
-Dproject.minio-url=http://127.0.0.1:9000 \
|
||||
-Dproject.eval-service-url=http://127.0.0.1:28480/evaluation/samples/receiveSync \
|
||||
";
|
||||
|
||||
|
||||
;; 程序 ICO
|
||||
[Icons]
|
||||
;Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}.exe"
|
||||
;Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}.exe"; Tasks: desktopicon
|
||||
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}\{#MyAppExeName}.bat"; Tasks: desktopicon
|
||||
|
||||
|
||||
;; 安装完运行的菜单与后续操作
|
||||
; [Run]
|
||||
;; 安装完成后运行 startup.exe
|
||||
; Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: postinstall runascurrentuser waituntilterminated skipifsilent hidewizard;
|
||||
|
||||
|
||||
|
||||
;; 自定义函数
|
||||
[Code]
|
||||
|
||||
const
|
||||
WM_SETTINGCHANGE = 26; // 0x001A 的十进制
|
||||
SMTO_ABORTIFHUNG = 2; // 0x0002 的十进制
|
||||
|
||||
// 定义 VC++ 2019 运行时的注册表检查路径
|
||||
VC2019_REDIST_X64 = '{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}';
|
||||
VC2019_REDIST_X86 = '{422B21A3-06FA-3F2F-A6C6-21BCC9B8E2F3}';
|
||||
|
||||
function SendMessageTimeout(
|
||||
hWnd: Integer;
|
||||
Msg: Integer;
|
||||
wParam: Integer;
|
||||
lParamStr: String;
|
||||
fuFlags: Integer;
|
||||
uTimeout: Integer;
|
||||
var lpdwResult: Integer
|
||||
): Integer;
|
||||
external 'SendMessageTimeoutW@user32.dll stdcall';
|
||||
|
||||
|
||||
// 给 Path 系统环境变量追加环境
|
||||
function NeedsAddPath(Param: string): boolean;
|
||||
var
|
||||
OrigPath: string;
|
||||
begin
|
||||
if not RegQueryStringValue(HKEY_LOCAL_MACHINE,
|
||||
'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
|
||||
'Path', OrigPath)
|
||||
then begin
|
||||
Result := True;
|
||||
exit;
|
||||
end;
|
||||
// 检查路径是否已存在
|
||||
Result := Pos(';' + Param + ';', ';' + OrigPath + ';') = 0;
|
||||
if Result = True then
|
||||
Result := Pos(';' + Param + '\;', ';' + OrigPath + ';') = 0;
|
||||
end;
|
||||
|
||||
|
||||
// 刷新系统环境
|
||||
procedure RefreshEnvironment;
|
||||
var
|
||||
Res: Integer;
|
||||
begin
|
||||
SendMessageTimeout(
|
||||
HWND_BROADCAST,
|
||||
WM_SETTINGCHANGE,
|
||||
0,
|
||||
'Environment',
|
||||
SMTO_ABORTIFHUNG,
|
||||
5000,
|
||||
Res
|
||||
);
|
||||
end;
|
||||
|
||||
|
||||
// 检查环境变量,路径是否存在空格
|
||||
function CheckRegistryPath(Path: string): Boolean;
|
||||
begin
|
||||
if Pos(' ', Path) > 0 then
|
||||
begin
|
||||
SuppressibleMsgBox('安装程序错误: 检测到无效的注册表路径 "' + Path + '"。路径不能包含空格。', mbCriticalError, MB_OK, IDOK);
|
||||
Abort;
|
||||
Result := False;
|
||||
Exit;
|
||||
end;
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
|
||||
// 以 UTF-8 写入文件
|
||||
function SaveStringToUTF8File(const FileName, Content: String; Append: Boolean): Boolean;
|
||||
var
|
||||
UTF8Content: AnsiString;
|
||||
begin
|
||||
UTF8Content := UTF8Encode(Content);
|
||||
Result := SaveStringToFile(FileName, UTF8Content, Append);
|
||||
end;
|
||||
|
||||
|
||||
// 检查是否已安装 VC++ 2019 运行时
|
||||
function IsVC2019Installed: Boolean;
|
||||
var
|
||||
Version: String;
|
||||
begin
|
||||
// 检查64位版本
|
||||
Result := RegQueryStringValue(
|
||||
HKLM,
|
||||
'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64',
|
||||
'Version',
|
||||
Version
|
||||
) or RegKeyExists(
|
||||
HKLM,
|
||||
'SOFTWARE\Classes\Installer\Dependencies\' + VC2019_REDIST_X64
|
||||
);
|
||||
|
||||
// 如果是32位系统或需要检查32位运行时
|
||||
if not Result and (not IsWin64) then
|
||||
Result := RegQueryStringValue(
|
||||
HKLM,
|
||||
'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x86',
|
||||
'Version',
|
||||
Version
|
||||
) or RegKeyExists(
|
||||
HKLM,
|
||||
'SOFTWARE\Classes\Installer\Dependencies\' + VC2019_REDIST_X86
|
||||
);
|
||||
end;
|
||||
|
||||
|
||||
// 在安装前检查
|
||||
function InitializeSetup: Boolean;
|
||||
begin
|
||||
// 默认允许安装继续
|
||||
Result := True;
|
||||
// 如果 VC++ 2019 未安装
|
||||
if not IsVC2019Installed then
|
||||
begin
|
||||
MsgBox('本程序需要 Microsoft Visual C++ 2019 运行时才能继续(1001)', mbError, MB_OK)
|
||||
// 中止安装
|
||||
Result := False;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
[UninstallRun]
|
||||
Filename: "taskkill"; Parameters: "-f -im simulation-web.exe"; Flags: runascurrentuser runhidden waituntilterminated
|
||||
|
||||
|
26
server/simulation/resources-initialize.bat
Normal file
26
server/simulation/resources-initialize.bat
Normal file
@ -0,0 +1,26 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
chcp 65001 >nul
|
||||
title Initialization
|
||||
|
||||
set "BASE_PATH=Resources/"
|
||||
|
||||
:: server 启动jar
|
||||
:: script 或数据库初始化脚本、或数据库补丁脚本
|
||||
:: web Nginx程序与代理配置
|
||||
:: dist 服务Web UI
|
||||
|
||||
echo [INFO] 正在创建 【实验】 初始化构建安装包目录结构
|
||||
for %%f in (
|
||||
"server"
|
||||
"script/simulation"
|
||||
"web"
|
||||
"dist"
|
||||
) do (
|
||||
echo [INFO] 创建: %%~f
|
||||
mkdir "%BASE_PATH%/%%~f"
|
||||
echo.
|
||||
)
|
||||
|
||||
pause
|
||||
endlocal
|
Loading…
x
Reference in New Issue
Block a user