dukuisong il y a 1 jour
Parent
commit
aa780838a6
4 fichiers modifiés avec 171 ajouts et 0 suppressions
  1. BIN
      script/icon.ico
  2. 91 0
      script/install_autostart.sh
  3. 8 0
      script/readme
  4. 72 0
      script/setup_menu.py

BIN
script/icon.ico


+ 91 - 0
script/install_autostart.sh

@@ -0,0 +1,91 @@
+#!/bin/bash
+
+# 显示帮助信息
+show_help() {
+    echo "用法: sudo ./install_autostart.sh [可执行文件路径] [可选:服务名称]"
+    echo "示例: sudo ./install_autostart.sh ./myapp myapp_service"  # 支持相对路径
+    echo "示例: sudo ./install_autostart.sh /home/user/app"         # 支持绝对路径
+    echo "说明:"
+    echo "  第一个参数: 可执行文件的路径(相对路径或绝对路径均可)"
+    echo "  第二个参数: 可选,自定义服务名称(默认使用文件名)"
+}
+
+# 检查参数是否正确
+if [ $# -lt 1 ]; thenc
+    echo "错误:请提供可执行文件的路径!"
+    show_help
+    exit 1
+fi
+
+# 解析参数并转换为绝对路径
+INPUT_PATH="$1"
+# 将传入的路径(无论相对/绝对)转换为绝对路径
+EXECUTABLE_PATH=$(realpath "$INPUT_PATH")
+
+# 检查转换后的路径是否存在
+if [ ! -f "$EXECUTABLE_PATH" ]; then
+    echo "错误:文件 $INPUT_PATH(转换后路径:$EXECUTABLE_PATH)不存在!"
+    exit 1
+fi
+
+# 检查文件是否可执行,不可执行则添加权限
+if [ ! -x "$EXECUTABLE_PATH" ]; then
+    echo "警告:文件 $EXECUTABLE_PATH 没有执行权限,正在添加..."
+    chmod +x "$EXECUTABLE_PATH" || {
+        echo "错误:无法为 $EXECUTABLE_PATH 添加执行权限!"
+        exit 1
+    }
+fi
+
+# 配置服务参数
+APP_NAME="${2:-$(basename "$EXECUTABLE_PATH")}"  # 服务名默认使用文件名
+APP_DESCRIPTION="Auto-start service for $APP_NAME"
+RUN_USER=$(whoami)
+WORKING_DIR=$(dirname "$EXECUTABLE_PATH")  # 工作目录为可执行文件所在目录
+SERVICE_FILE="/etc/systemd/system/$APP_NAME.service"
+
+# 创建 systemd 服务文件(使用转换后的绝对路径)
+echo "正在创建服务文件: $SERVICE_FILE"
+sudo tee "$SERVICE_FILE" > /dev/null << EOF
+[Unit]
+Description=$APP_DESCRIPTION
+After=network.target
+
+[Service]
+User=$RUN_USER
+WorkingDirectory=$WORKING_DIR
+ExecStart=$EXECUTABLE_PATH  # 使用绝对路径
+Restart=always
+RestartSec=5
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+# 设置服务文件权限
+sudo chmod 644 "$SERVICE_FILE"
+
+# 启用并启动服务
+echo "重新加载系统服务配置..."
+sudo systemctl daemon-reload
+
+echo "启用开机自启..."
+sudo systemctl enable "$APP_NAME.service"
+
+echo "启动服务..."
+sudo systemctl start "$APP_NAME.service"
+
+# 验证服务状态
+echo -e "\n服务状态验证:"
+sudo systemctl status "$APP_NAME.service" --no-pager
+
+echo -e "\n----------------------------------------"
+echo "操作完成!程序已配置为开机自启。"
+echo "服务名称: $APP_NAME"
+echo "可执行文件绝对路径: $EXECUTABLE_PATH"
+echo "管理命令:"
+echo "  启动: sudo systemctl start $APP_NAME.service"
+echo "  停止: sudo systemctl stop $APP_NAME.service"
+echo "  重启: sudo systemctl restart $APP_NAME.service"
+echo "  查看日志: sudo journalctl -u $APP_NAME.service -f"
+echo "  移除自启: sudo systemctl disable $APP_NAME.service"

+ 8 - 0
script/readme

@@ -0,0 +1,8 @@
+install_silent.vbs 添加office_helper.exe到开机启动项
+
+uninstall_silent.vbs 添加office_helper.exe启动项
+
+pyinstaller --uac-admin --onefile --noconsole --icon=icon.ico setup_menu.py
+
+setup_menu.exe install "上传到我的文档" "E:\PycharmProjects\office_plugin\dist\upload_file.exe" icon.ico
+setup_menu.exe uninstall "上传到我的文档"

+ 72 - 0
script/setup_menu.py

@@ -0,0 +1,72 @@
+import ctypes
+import winreg
+import sys
+import os
+import logging
+
+# 设置日志等级(注释掉可完全静默)
+
+
+def add_context_menu(name: str, exe_path: str, icon_path: str = None):
+    """添加右键菜单"""
+    key_path = fr"*\\shell\\{name}"
+    try:
+        key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, key_path)
+        winreg.SetValueEx(key, "", 0, winreg.REG_SZ, name)
+        if icon_path:
+            winreg.SetValueEx(key, "Icon", 0, winreg.REG_SZ, icon_path)
+
+        command_key = winreg.CreateKey(key, "command")
+        winreg.SetValueEx(command_key, "", 0, winreg.REG_SZ, f'"{exe_path}" "%1"')
+
+        winreg.CloseKey(key)
+
+    except Exception as e:
+        pass
+
+
+def remove_context_menu(name: str):
+    """删除右键菜单"""
+    key_path = fr"*\\shell\\{name}"
+    try:
+        winreg.DeleteKey(winreg.HKEY_CLASSES_ROOT, key_path + r"\command")
+        winreg.DeleteKey(winreg.HKEY_CLASSES_ROOT, key_path)
+    except Exception as e:
+        pass
+
+
+def is_admin():
+    try:
+        return ctypes.windll.shell32.IsUserAnAdmin()
+    except:
+        return False
+
+
+def relaunch_as_admin():
+    """尝试以管理员权限重新运行当前脚本"""
+    params = ' '.join(f'"{arg}"' for arg in sys.argv)
+    ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, params, None, 0)
+
+
+def main():
+    if len(sys.argv) < 3:
+        return
+
+    command = sys.argv[1].lower()
+    name = sys.argv[2]
+
+    if command == "install":
+        if len(sys.argv) < 4:
+            return
+        exe_path = os.path.abspath(sys.argv[3])
+        icon_path = os.path.abspath(sys.argv[4]) if len(sys.argv) >= 5 else exe_path
+        add_context_menu(name, exe_path, icon_path)
+    elif command == "uninstall":
+        remove_context_menu(name)
+
+
+if __name__ == "__main__":
+    if not is_admin():
+        relaunch_as_admin()
+        sys.exit()
+    main()