1. 打开注册表编辑器:按下Win+R键,输入regedit,回车。
  2. 找到服务的注册表项:在注册表编辑器中,依次展开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services。
  3. 找到需要修改的服务:在Services下找到需要修改的服务的注册表项。
  4. 修改服务名称:在服务的注册表项中,找到DisplayName键,双击打开,修改键值数据为新的服务名称。
  5. 修改服务描述:在服务的注册表项中,找到Description键,双击打开,修改键值数据为新的服务描述。
  6. 保存修改:修改完成后,点击注册表编辑器的“文件”菜单,选择“退出”保存修改。
  7. 重启计算机:修改服务名称和描述后,需要重启计算机才能生效。

简单版:

export function HandleUrlParam(url: string, param?: Record<string, any> | null): string {
  if (param) {
    const paramArray = [] as string[];
    const keys = Object.keys(param);
    for (let i = 0; i < keys.length; i++) {
      const key = keys[i];
      const value = param[key]?.toString() ?? "";
      paramArray.push(`${key}=${value}`);
    }
    if (paramArray.length > 0) {
      let paramText = paramArray.join("&");

      if (url.indexOf("?") >= 0) {
        url = `${url}${paramText}`;
      } else {
        url = `${url}?${paramText}`;
      }
    }
  }
  return url;
}

复杂版:
https://github.com/Leonardozn/json-qs-converter

Plus版:

export function HandleUrlParamPlus(url: string, param?: Record<string, any> | null): string {
  if (param) {
    let paramArray = GetUrlParamList('',param);

    if (paramArray.length > 0) {
      let paramText = paramArray.join("&");

      if (url.indexOf("?") >= 0) {
        url = `${url}${paramText}`;
      } else {
        url = `${url}?${paramText}`;
      }
    }
  }
  return url;
}

function GetUrlParamList(parentKey: string, param?: Record<string, any> | null) {
  let paramArray = [] as string[];
  if (param) {
    const keys = Object.keys(param);
    for (let i = 0; i < keys.length; i++) {
      const key = keys[i];
      const value = param[key] ?? "";
      if (!_.isObject(value)) {
        if (parentKey) {
          paramArray.push(`${parentKey}.${key}=${value}`);
        } else {
          paramArray.push(`${key}=${value}`);
        }
      } else {
        let childParamList = GetUrlParamList(key, value)
        if (parentKey) {
          for (let i = 0; i < childParamList.length; i++) {
            childParamList[i] = `${parentKey}.${childParamList[i]}`
          }
        }
        paramArray = _.concat(paramArray, childParamList)
      }
    }
  }
  return paramArray
}

# 判断当前用户是否为管理员
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

# 如果当前用户不是管理员,则重新以管理员身份启动 PowerShell
if (-not $isAdmin) {
    # 获取当前脚本的路径
    $scriptPath = $MyInvocation.MyCommand.Path
    Start-Process PowerShell -Verb RunAs "-Command `"cd '$pwd'; & '$scriptPath';`""
    exit
}

# 在这里编写需要以管理员身份运行的代码

main.ts

import '~/util/openInEditorConfig'

openInEditorConfig.ts

import { warpperEnv } from "~/util/build";

let envSettings = warpperEnv()
if (process.env.NODE_ENV === 'development') {
    let host = window.location.host
    window.VUE_DEVTOOLS_CONFIG = {
        openInEditorHost: `http://${host}/${envSettings.VITE_PUBLIC_PATH}/`
    }
}

src\util\build\index.ts

/**
 * 默认环境配置, 具体配置在 .env.xxx文件中修改
 */
const settings: EnvSettings = {
  VITE_PORT: 5003,
  VITE_PUBLIC_PATH: "/projexec",
  VITE_ONLY_OFFICE_HOST: 'http://192.168.101.88:1080',
  VITE_DOCUMENT_SERVER_HOST: 'http://localhost:9540',
  VITE_DOCUMENT_SERVER_VUE_HOST: 'http://localhost:8848',
  VITE_FILE_READY_ADDRESS: "http://xxxxxxxxxxxxx.aliyuncs.com/"
};

/**
 * 包装环境配置,用于将字符串格式化为boolean或number类型
 * @param envConf 环境配置
 * @returns 
 */
const warpperEnv = (envConf?: Record<string, any>): EnvSettings => {
  let ret = { ...settings, };

  if (!envConf) envConf = loadEnv()
  for (const envName of Object.keys(envConf)) {
    const envValue = envConf[envName]
    if (!envValue || typeof (envValue) !== 'string') {
      continue
    }

    let value: any = envValue.replace(/\\n/g, "\n");

    if (value === "true") {
      value = true
    } else if (value === "false") {
      value = false;
    }

    if (envName === "VITE_PORT") {
      value = Number(value);
    }

    ret[envName] = value;
  }
  return ret;
};


/**
 * 加载环境变量 import.meta.env
 * @returns 
 */
const loadEnv = () => {
  /**
   * development 开发环境从import.meta.env获取环境变量
   * 非development 开发环境则从config.js获取环境变量
   */

  // 在生产环境中,这些环境变量会在构建时被静态替换,因此,在引用它们时请使用完全静态的字符串。动态的 key 将无法生效。例如,动态 key 取值 import.meta.env[key] 是无效的。
  // https://cn.vitejs.dev/guide/env-and-mode.html#env-variables
  const env = import.meta.env;

  if (env.MODE === 'development') {
    return env;
  }

  Object.assign(env, window.appConfig)

  return env;
};

export { settings, warpperEnv };

public\config.js-test

window.appConfig = {
  // VITE_PORT:'80',
  VITE_PUBLIC_PATH:'projexec',
  VITE_ONLY_OFFICE_HOST:'http://192.168.101.88:1080',
  VITE_DOCUMENT_SERVER_HOST:'http://192.168.101.80:55000/document',
  VITE_DOCUMENT_SERVER_VUE_HOST:'http://192.168.101.80:55000/document',
  VITE_FILE_READY_ADDRESS: "http://xxxxxxxxxxxxxx.aliyuncs.com/"
}