速查指南

Window Bat

注意脚本需要换行符为CRLF,如果是LF则会出现奇怪的吃字符的问题。

获取命令行参数

@echo off
setlocal enabledelayedexpansion

set VERSION=""
:parse_args
if "%1"=="" goto done
if "%1"=="-r" (
    set BUILD_TYPE=Release
) else if "%1"=="-d" (
    set BUILD_TYPE=Debug
) else if "%1"=="-i" (
    set DO_INSTALL=true
) else if "%1"=="-t" (
    set BUILD_TOOLS=ON
) else if "%1"=="-v" (
    set VERSION="%2"
    shift
) else (
    echo Invalid argument: %1
    echo Usage: %0 [-r Release] [-d Debug] [-i install] [-t build with tools]
    exit /b 1
)
shift
goto parse_args
:done

正则匹配

set VERSION_REGEX=^v([0-9]+)\.([0-9]+)\.([0-9]+)(\-[a-zA-Z]+[0-9]*)?(\+.*)?$
for /f "delims=" %%i in ('powershell -Command "[regex]::IsMatch('%VERSION%', '%VERSION_REGEX%')"') do set MATCH=%%i
set major=""
set minor=""
set patch=""
set metadata=""
set build=""
if "%MATCH%"=="True" (
    set for_counter=0
    for /f "delims=" %%j in ('powershell -Command "$version = '%VERSION%'; if ($version -match '%VERSION_REGEX%') { echo $matches[1],$matches[2],$matches[3],$matches[4],$matches[5] }"') do (
        set /a for_counter+=1
        if "!for_counter!"=="1" (
            set major=%%j
        ) else if "!for_counter!"=="2" (
            set minor=%%j
        ) else if "!for_counter!"=="3" (
            set patch=%%j
        ) else if "!for_counter!"=="4" (
            set metadata=%%j
            set metadata=!metadata:~1!
        ) else if "!for_counter!"=="5" (
            set build=%%j
            set build=!build:~1!
        )
    )
) else (
    if "!VERSION!"=="" (
        echo No version input.
    ) else (
        echo Version !VERSION! is invalid, match regex is !VERSION_REGEX!
        exit /b 1
    )
)
echo Going to build with version, major:!major!, minor:!minor!, patch:!patch!, metadata:!metadata!, build:!build!

局部环境变量

set TOOL_DIR=%~dp0\release\win64\tools
set THIRDPARTY_DIR=%~dp0\release\win64\3rd
set LIB_DIR=%~dp0\release\win64\lib

set PROJ_DIR=%~dp0

setlocal
pushd %TOOL_DIR%
set PATH=%THIRDPARTY_DIR%;%LIB_DIR%;%PATH%
.\run_something
popd

endlocal

网络

端口转发配置

Windows自带的端口转发工具netsh使用方法 (github.com)

微软Windows的netsh是一个命令行脚本实用工具。使用netsh工具 ,可以查看或更改本地计算机或远程计算机的网络配置。不仅可以在本地计算机上运行这些命令,而且可以在网络上的远程计算机上运行。 下面的代码在windows下运行后可以将172.20.53.1的14941端口转发到172.20.53.2的3389端口上。

添加转发端口

netsh interface ipv6 install
netsh interface portproxy add v4tov4 listenaddress=172.20.53.1 listenport=14941 connectaddress=172.20.53.2 connectport=3389

查看转发端口

netsh interface portproxy show v4tov4

取消端口转发

netsh interface portproxy delete v4tov4 listenaddress=172.20.53.1 listenport=14941

刷新DHCP IP

# 释放当前 IP 地址
ipconfig /release

# 重新获取 IP 地址
ipconfig /renew

ipconfig /

设置入站出站规则

Windows防火墙开着的时候,大部分入站端口都是关闭的,比如22,21等,如果外部想要链接的话需要手动开放。

# Win + R 然后输入firewall.cpl打开防火墙设置
# 随后点击右侧栏的高级设置
# 点击入站规则,并且增加相应的规则

查看端口占用情况

# 打印当前端口情况
netstat -ano

# 查找特定端口号对应进程
netstat -ano | findstr "7890"

# 显示的最后一行就是进程的PID,随后可以用后面的命令查看进程到底是谁。
# 打印信息,格式如下:
# Proto: 协议类型(TCP 或 UDP)。
# Local Address: 本地地址和端口号。
# Foreign Address: 远程地址和端口号。
# State: 连接状态(例如 LISTENING, ESTABLISHED 等)。
# PID: 使用该端口的进程 ID。

# TCP    0.0.0.0:7890           0.0.0.0:0              LISTENING       23604

# 随后查看PID对应的进程到底是什么
tasklist /FI "PID eq 23604"

# 强杀进程
taskkill /PID 23604 /F

ARP

# 查看所有接口的arp缓存
arp -a
# 查询特定IP的arp缓存
arp -a 192.168.1.1

路由跟踪

# route指令
# 打印本机的路由表
route print

# 路由跟踪指令tracert
tracert 192.168.0.x

磁盘

Window测试磁盘速度

winsat disk -drive D

网络驱动器

通过图形界面添加:

如果远端断连的话,windows会不断尝试连接,导致图形界面卡住,这个时候可以使用命令行手动断开连接

# 首先查看映射过的网络驱动器
net use

# 随后删除
net use Z: /delete

Powershell

建议安装powershell7

powershell递归删除文件夹

Remove-Item -Recurse -Force

打印环境变量

$env:FACEUNITY_SIGN_TOOL

关闭Tab提示音

打开音量,把terminal的音量关掉就行了。

自定义脚本

# pwsh的初始化脚本路径在,以下环境变量的路径中。
$PROFILE.CurrentUserCurrentHost

# 我现有的配置
Set-Alias lvim 'C:\Users\kaihang\.local\bin\lvim.ps1'
Set-Alias vim 'C:\Users\kaihang\.local\bin\lvim.ps1'

Set-Alias proxy 'C:\Users\kaihang\.local\bin\set-proxy.ps1'
Set-Alias unproxy 'C:\Users\kaihang\.local\bin\unset-proxy.ps1'

# C:\Users\kaihang\.local\bin\set-proxy.ps1
$env:http_proxy = "http://127.0.0.1:7890"
$env:https_proxy = "http://127.0.0.1:7890"
Write-Output "开启代理"

# C:\Users\kaihang\.local\bin\unset-proxy.ps1
$env:http_proxy = $null
$env:https_proxy = $null
Write-Output "关闭代理"

注册表相关

创建对后缀文件的双击操作

首先打开注册表工具:Win + R,输入regedit,随后找到: 然后在里面添加就行了。举个例子,对于*.fu文件我想添加使用脚本进行解压,结构如下所示: command中的值是:"D:\Programs\pack_bundle\library\CSigner\pack.bat" "%1"PackNamaBundleCRT中的值是注释信息。

mp4

这是因为在现代 Windows(尤其是 Win10 和 Win11)中,直接在 .mp4 这种后缀名下加 shell 往往是不起作用的。

Windows 会优先查看该后缀名绑定的 “ProgID”(比如 VLC.mp4、WMP11.AssocFile.MP4 等)或者 “系统文件关联”

要解决这个问题,最简单且通用的办法是改到 SystemFileAssociations 路径下: 计算机\HKEY_CLASSES_ROOT\SystemFileAssociations\.mp4\shell

开启启动

# 首先打开注册表 regedit
# 然后找到下面字段,并且添加或者修改
# 针对当前用户
计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

# 针对所有用户
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

Visual Studio

# 通常在注册表中的一下位置的InstallationFolder字段中
# 尽量不要手动修改
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0

Hyper-V虚拟机

Hyper-V in Windows 10 and Windows 11 Home Edition

慎用:windows累积更新失败的原因大概率是这个导致的,并且会导致升级专业版失败

通常只有专业版或者企业版允许使用Hyper-V,家庭版本来不支持,这里可以用脚本开启。

首先开启虚拟化。(bios配置、然后启动或关闭window功能开启相关功能)

然后以管理员权限执行以下脚本,就可以在启动或关闭windows功能中看到了:

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
pause

NAT虚拟网络

设置 NAT 网络 | Microsoft Learn

创建

# 创建内部交换机
New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal

# 查看,并记录一下ifIndex
Get-NetAdapter

# 随后使用以下命令配置NAT网关
# IPAddress:NAT网关IP指定要用作NAT网关IP的IPv4或IPv6地址
# PrefixLength:NAT子网前缀长度定义的NAT本地子网大小(子网掩码)
# InterfaceIndex: 就是上一步确定的虚拟交换机的接口索引
New-NetIPAddress -IPAddress <NAT Gateway IP> -PrefixLength <NAT Subnet Prefix Length> -InterfaceIndex <ifIndex>

# 以下是个例子,创建一个NAT网关
New-NetIPAddress -IPAddress 111.111.111.1 -PrefixLength 24 -InterfaceIndex 66

# 使用New-NetNat配置NAT网络
# Name:NATOutsideName描述NAT网络的名称。将使用此参数删除NAT网络。
# InternalIPInterfaceAddressPrefix: NAT子网前缀描述NAT网关IP前缀和NAT子网前缀长度。
New-NetNat -Name <NATOutsideName> -InternalIPInterfaceAddressPrefix <NAT subnet prefix>

# 举个例子,配置NAT网络
New-NetNat -Name SelfNATNetwork -InternalIPInterfaceAddressPrefix 111.111.111.0/24

# 查看当前创建的NAT网络
Get-NetNat

# WinNAT本身不会自动分配IP地址,并将IP地址分配给endpiont,所以需要VM手动设置IP

支持远端X11

  1. windows端下载X11客户端vcxsrv 保存的一个下载连接:下载
  2. 配置windows环境变量,添加DISPLAY=localhost:0.0。这个很关键,要不ssh -Y不会自动设置DISPLAY环境变量。
  3. vscode的remote ssh配置添加:
Host some_host
    ...
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
  1. vscode配置setting.json中添加linux DISPLAY环境变量:
// 需要添加这一步是因为vscode设置的DISPLAY环境变量好像是被bash清空了,可以
// 在vscode的 "输出 -> Remote SSH" 搜索DISPLAY,可以看到实际上已经设置过了,
// 但是在terminal中却看到为空。下面填写的DISPLAY值也是从上面输出中获取的。
{
	...
	"terminal.integrated.env.linux": {
		"DISPLAY": "faceunity:10.0"
	},
	...
}

或者使用ssh命令行直接:ssh -Y some_user@some_host

WSL

安装

# 开启linux子系统

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 开启虚拟平台支持,才能在windows平台安装linux子系统
dism /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

# 随后重启电脑,并且去商店中安装ubuntu。

# 然后将wsl2设置成默认版本
wsl --set-default-version 2

配置

硬盘装载

实际测试发现,直接从/mnt访问windows的文件系统会非常的慢,所以跨硬盘增加存储的话,可以通过创建虚拟硬盘,然后挂载到wsl中来实现。但是有个缺点,每次wsl虚拟机down掉之后(包括wsl –shutdown和电脑重启),都需要重新–mount
# 创建一个 50GB 的动态虚拟硬盘文件(用多少占多少,上限50G)
mkdir E:\WSLDisk
New-VHD -Path E:\WSLDisk\wsl-data.vhdx -SizeBytes 50GB -Dynamic

# 扩容,需要在wsl关闭状态下
Resize-VHD -Path "E:\WSLDisk\wsl-data.vhdx" -SizeBytes 100GB

# 关闭wsl,然后挂载
wsl --shutdown
wsl --mount E:\WSLDisk\wsl-data.vhdx --vhd --bare

# wsl中查看新加的硬盘
lsblk

# 构建文件系统,只用在第一次挂载的时候需要做
sudo mkfs.ext4 /dev/sdc

增加脚本一键reload

# 打开 $PROFILE

# 添加
function wsl-reload {
    Write-Host "1. 正在关闭 WSL..." -ForegroundColor Yellow
    wsl --shutdown
    
    Write-Host "2. 正在触发挂载任务..." -ForegroundColor Yellow
    # 这一步是核心:手动触发那个任务计划,帮你执行挂载
    schtasks /run /tn "WSL Auto Mount" 
    
    Write-Host "3. 等待挂载生效 (2秒)..." -ForegroundColor Yellow
    Start-Sleep -Seconds 2
    
    Write-Host "4. 进入 WSL" -ForegroundColor Green
    wsl
}

限制CPU使用量

  1. 找到或创建 .wslconfig 文件
    这个文件位于你的 Windows 用户目录下,路径是 C:\Users<你的用户名>.wslconfig。
    你可以在文件资源管理器的地址栏输入 %UserProfile% 然后回车,直接进入该目录。如果没有这个文件,就新建一个。
  2. 编辑 .wslconfig 文件
    用记事本或 VS Code 等编辑器打开它,添加或修改以下内容:
[wsl2]
processors=4  # 限制WSL2最多使用4个CPU核心 你可以把 4 改成你希望的任何数字。
  1. 重启 WSL
    修改并保存文件后,这个配置不会马上生效。你需要关闭所有 WSL 终端,然后在 Windows 的 PowerShell 或 CMD 中运行以下命令来彻底关闭 WSL:
wsl --shutdown
# 之后,重新打开你的 WSL 终端,新的配置就会生效。你可以通过在 WSL 中运行 nproc 命令来验证核心数是否已经被限制。

网络配置

配置共享网络(和Host同IP)

[wsl2]
[experimental]
networkingMode=mirrored # 最关键的
dnsTunneling=true
firewall=true
autoProxy=true

配置bridge网络(默认NAT网络)

这个用不到 首先电脑开启Hyper-V,如果系统是家庭版 参照疑难杂症开启Hyper-V。

随后利用Hyper-V管理器创建一个bridge网络:

最后添加配置文件

# ~/.wslconfig
[wsl2]
networkingMode = bridged
vmSwitch = WslBridge
ipv6=true
[experimental]
autoProxy=false # remove nat proxy warning message

访问wsl目录

# 可以访问wsl的目录
\\wsl$  # 直接在资源管理器中输入路径 或者Win + R输入

存储迁移

导出当前Distro

wsl --export Ubuntu ubuntu.tar

注销现有的镜像:

wsl --unregister Ubuntu

指定目标存储目录,并且进行导入:

# 指令含义:
# wsl --import <DistroName> <TargetPath> <ExportedFilePath>
wsl --import Ubuntu22.04 E:\ProgramData\cache\WSL\Ubuntu22.04 .\ubuntu.tar

指定默认的Distro:

wsl -s Ubuntu22.04

WSL指定默认用户:

# 修改/etc/wsl.conf文件,添加
[user]
default = <用户名>

# 随后重启wsl
wsl --shutdown Ubuntu22.04
wsl