Wxf`s Fantasy World

share something useful


Windows软件管理 msys2

window主要靠两个软件:msys2(类linux环境)、scoop

流程

所有数据都放到u盘了,所以只要恢复软件及其配置
拿到一个新电脑,先安装msys2,然后恢复其配置文件,再安装scoop,完成

msys配置

msys的核心是这些配置文件,把它们上传到github,定期更新,迁移到新电脑时git clone一下就行
然后需要修改注册表,我写了三个脚本,执行一遍,msys配置就完成了!!!
main-init.sh

#!/bin/bash

# change environment variables
. chg-env-var.sh

# change reg
. chg-reg.sh

# install cmd tool 
. command-install.sh

chg-env-var.sh

#!/bin/bash

# Set the system environment variable list
SYS_ENV_VARS=(
	""
)

# Create the system batch file
cat > update_sys_env.bat << EOF
@echo off
REM Update system environment variables
EOF

for env_var in "${SYS_ENV_VARS[@]}"
do
  var_name="${env_var%=*}"
  var_value="${env_var#*=}"
  echo "setx $var_name \"$var_value\" /M" >> update_sys_env.bat
done

# Call the system batch file
cmd /c update_sys_env.bat
# Remove the tmp files
rm update_sys_env.bat




# Set the user environment variable list
USER_ENV_VARS=(
  "MSYS2_PATH_TYPE=inherit"
  "EMACS_SERVER_FILE=C:\msys64\home\dell\.emacs.d\server\server"
)


# Create the batch file
cat > update_user_env.bat << EOF
@echo off

REM Get the user profile path for the main computer user
for /f "tokens=2 delims==" %%a in ('wmic useraccount where name="%username%" get sid /value') do set sid=%%a
set "sid=%sid:~0,-18%"
set "userprofile=C:\Users\%username%"

REM Update environment variables
EOF

for env_var in "${USER_ENV_VARS[@]}"
do
  var_name="${env_var%=*}"
  var_value="${env_var#*=}"
  echo "setx $var_name \"$var_value\"" >> update_user_env.bat
done

# Call the batch file with cmd.exe
cmd.exe /c update_user_env.bat

# Remove the tmp files
rm update_user_env.bat

chg-reg.sh

#!/bin/bash

# 使用 cmd 执行 reg add 命令
cmd /c "reg add HKEY_CLASSES_ROOT\org-protocol\shell\open /v \"command\" /t REG_SZ /d \"\\\"C:\\msys64\\mingw64\\bin\\emacsclientw.exe\\\" \\\"%1\\\"\" /f"

command-install.sh

#!/bin/bash

# 定义软件包名称列表
packages=(
          "vim"
	  "mingw-w64-x86_64-ffmpeg"
	  "dialog"
	  "mingw-w64-x86_64-spdlog"
	  "mingw-w64-x86_64-emacs"
	  "git"
  )

# 循环遍历软件包列表中的每个软件包名称
for package in "${packages[@]}"; do
    # 检查软件包是否已经安装
    if pacman -Qq $package > /dev/null 2>&1; then
        echo "$package is already installed, skipping..."
    else
        # 安装软件包
        echo "Installing $package..."
        pacman -S --noconfirm $package

        # 检查软件包是否成功安装
        if [ $? -ne 0 ]; then
            echo "Error: Failed to install $package"
            exit 1
        fi
    fi
done