Windows 学习笔记

一份完整的 Windows 学习笔记。学多少记多少,重点讲"为什么这么设计"(费曼式 📌 讲解),配 draw.io 图。

图表在 /Windows学习笔记/diagrams/ 目录。图注名即原图文件名(如图注"图 1 · Windows 架构分层"对应 图1_Windows架构分层.d2 / 图1_Windows架构分层.d2.svg),改图请编辑同名 .d2 源文件后运行 scripts/build-d2.ps1 重新渲染。

怎么用这份笔记

  1. 学习/复习 → 顺序看正文,重点看 📌 类比和"为什么"
  2. 查命令 → 翻 附录 A 速查手册
  3. 检验 → 做 附录 B 自测题,盖住答案自答
  4. 落地 → 跟 附录 C 实战项目做一遍,把知识串起来

1 · Windows 概述与架构

1.1 Windows 是什么

  • Windows 是微软开发的商业操作系统,1985 年推出首个版本
  • Windows NT 是现代 Windows 的内核架构(NT = New Technology),1993 年推出,取代了旧的 DOS 系列(Windows 9x)
  • 当前主流版本:Windows 10 / Windows 11(桌面)、Windows Server 2019/2022(服务器)

1.2 Windows vs Linux 内核模型对比

Windows NT Linux
许可证 闭源商业 开源 GPL
内核类型 混合内核 宏内核
用户空间 Win32 API / COM / .NET GNU 工具 / POSIX API
默认 Shell CMD / PowerShell bash / sh
包管理 winget / Store(较新) apt / dnf(历史悠久)
TIP

📌 什么是"混合内核"?Linux 是宏内核——文件系统、驱动、网络协议栈全在内核态,性能好但耦合度高。Windows NT 是混合内核——核心功能在内核态,但部分子系统在用户态隔离运行,牺牲少量性能换取更好的隔离性。

打个比方:宏内核像"全包式公司"——所有部门在同一栋楼,沟通快但一个部门着火可能烧全楼。混合内核像"分散办公"——核心部门在总部,其他部门在独立楼层,一个部门出问题不波及全局,但跨部门沟通多走几步路。

1.3 整体架构(分层模型)

图 1 \xb7 Windows 架构分层

层 作用 你能看到的例子
用户应用程序 最顶层,用户直接交互 浏览器、Office、PowerShell
子系统 兼容不同 API 的适配层 Win32 子系统、WSL(Linux 子系统)
Native API 内核对外暴露的底层 API NtCreateFile()、NtReadFile()
Windows NT 内核 核心执行体 + 微内核 进程/线程调度、内存管理、I/O 管理
硬件 物理资源 CPU、RAM、磁盘、网卡
TIP

📌 Windows 也有用户态/内核态隔离,原理和 Linux 一样:CPU 分 Ring 0(内核态)和 Ring 3(用户态)。但 Windows 的 Native API 是未公开文档的——微软只让开发者用上层的 Win32 API(如 CreateFile()),Win32 API 内部再调用 Native API。这给了微软重构内核的自由。

📌 子系统是什么?Windows NT 设计之初要兼容多种环境,于是设计了"子系统"层——每个子系统把各自 API 翻译成统一的 Native API。WSL(Windows Subsystem for Linux)就是利用这个架构,加了一个 Linux 兼容子系统,让 Linux 程序直接跑在 Windows 上。

1.4 常用探索命令

$PSVersionTable                    # PowerShell 版本
systeminfo                         # 详细系统信息
hostname                           # 计算机名
ver                                # CMD 下看版本

2 · 文件系统与目录结构

2.1 核心规则:盘符 + 反斜杠

图 2 \xb7 Windows 目录结构

Windows 以盘符为根(C:\、D:\),路径用反斜杠 \ 分隔。

C:\ ← 系统盘 ├── Windows\ ← 操作系统文件 ├── Program Files\ ← 64位软件安装目录 ├── Program Files (x86)\ ← 32位软件安装目录 ├── Users\ ← 用户目录(对应 Linux 的 /home) │ ├── hisos\ ← 用户家目录 │ └── Public\ ← 公共共享目录 ├── ProgramData\ ← 应用程序数据(隐藏,对应 /var) └── Temp\ ← 临时文件
TIP

📌 为什么 Windows 用盘符而 Linux 用单根树?历史决定。Windows 继承了 DOS 的盘符设计——早期 PC 有多个软盘驱动器(A:、B:),硬盘从 C: 开始。Linux 的单根树更优雅(见 Linux 笔记 02 章),但盘符对普通用户更直观——"文件在 D 盘"比"文件挂载在 /data"更容易理解。

📌 为什么用反斜杠 \?DOS 历史遗留:DOS 用 / 作为命令选项前缀(如 dir /w),为不冲突,路径分隔符用了 \。现代 Windows API 实际上两种斜杠都支持,但惯例统一用 \。

2.2 重要目录详解

目录 关键点 对应 Linux
C:\Windows\System32 系统核心文件、DLL、驱动 /usr/sbin + /lib
C:\Windows\System32\drivers\etc hosts 文件、网络配置 /etc
C:\Users\<用户名> 用户家目录 /home/<用户名>
C:\Users\<用户名>\AppData 应用数据(Local/Roaming/Temp) ~/.config + ~/.local
C:\ProgramData 全局应用数据(隐藏) /var
C:\Windows\Temp 系统临时文件 /tmp
C:\Windows\Logs 系统日志 /var/log
TIP

📌 注册表是什么?Windows 独有的集中式配置数据库。Linux 的配置散在 /etc 下的文本文件里,改配置就是改文件。Windows 把系统配置、应用配置、硬件信息全塞进注册表这个树形数据库里,用 regedit 或 reg 命令操作。

打个比方:Linux 的配置像"一柜子文件夹"——每个软件一个配置文件,用记事本就能改。注册表像"一个巨型 Excel"——所有软件的设置都在这一张表里,结构化但复杂,改错一行可能系统起不来。

2.3 NTFS 文件系统

特性 NTFS ext4
权限模型 ACL(访问控制列表) rwx + owner/group/other
日志 有(事务日志) 有(journal)
压缩 内置透明压缩 需额外工具
加密 EFS 需 LUKS 等
大小写敏感 默认不敏感 敏感
TIP

📌 NTFS 权限比 Linux rwx 精细得多。Linux 每个文件只有三组权限(owner/group/other),每组 rwx。NTFS 用 ACL——可以给任意多个用户/组分别设置不同的权限组合(读、写、执行、删除、修改权限……十几种权限位)。

打个比方:Linux 权限像"三把钥匙"——主人、团队、外人各一把。NTFS 权限像"门禁系统"——可以给每个人单独设一张卡,每张卡能进哪些门、什么时段能进,全部独立配置。

2.4 常用探索命令

Get-ChildItem C:\Windows -Force       # 列目录(含隐藏)
Get-PSDrive                           # 列出所有盘符和空间
Get-Volume                            # 卷信息
Get-Item C:\pagefile.sys | Format-List *  # 文件详情

3 · 核心命令

图 3 \xb7 Windows 核心命令分类

3.1 CMD vs PowerShell

CMD PowerShell
诞生 1987 2006
数据类型 纯文本 对象(.NET 对象)
管道传递 文本流 对象流
编程能力 弱(bat) 强(完整编程语言)
别名 无 兼容 CMD/Linux 命令名
TIP

📌 PowerShell 为什么是"面向对象"的?bash 管道传文本,grep 搜文本、awk 切列。PowerShell 管道传对象——Get-Process 输出 Process 对象,可以直接 Get-Process | Where-Object {$_.CPU -gt 10},不用切列、不用正则。

打个比方:bash 管道像"传纸条"——上个工序写好文字,下个工序得自己解析。PowerShell 管道像"传快递包裹"——里面是结构化的物品,标签上写着属性,直接取用。

3.2 Get-ChildItem — 列出目录

Get-ChildItem C:\Windows           # = ls / dir
Get-ChildItem -Force               # 显示隐藏文件
Get-ChildItem -Recurse -Filter "*.log"  # 递归查找
Get-ChildItem | Sort-Object Length -Descending | Select-Object -First 5  # 最大的5个

Mode 列解读:

d r h s a ↑ ↑ ↑ ↑ ↑ │ │ │ │ └── Archive │ │ │ └──── System │ │ └────── Hidden │ └──────── Read-only └────────── Directory(d=目录,-=文件)

3.3 路径导航

Get-Location                     # = pwd
Set-Location C:\Windows          # = cd
Set-Location ..                  # 上级
Set-Location ~                   # 家目录
$HOME                            # C:\Users\hisos

3.4 文件操作

New-Item -ItemType Directory -Path C:\test\sub -Force  # = mkdir -p
New-Item -ItemType File -Path C:\test\empty.txt        # = touch
Copy-Item C:\src.txt C:\dst.txt                         # = cp
Copy-Item C:\src\* C:\dst\ -Recurse                    # 递归复制
Move-Item old.txt new.txt                              # = mv
Remove-Item C:\test\ -Recurse -Force                   # = rm -rf
Test-Path C:\Windows\System32\notepad.exe              # 文件是否存在
TIP

📌 PowerShell 命令为什么这么长?New-Item、Get-ChildItem 比 Linux 的 touch、ls 长得多。这是 Verb-Noun 命名规范:动词表示动作(Get/New/Set/Remove),名词表示对象(Item/Process/Service)。好处是自描述,坏处是啰嗦——所以有大量别名(rm = Remove-Item、cp = Copy-Item)。

3.5 文本查看与搜索

Get-Content file.txt            # = cat
Get-Content file.txt -Tail 20   # = tail -20
Get-Content file.txt -Wait      # = tail -f
Select-String "error" file.txt  # = grep
Get-ChildItem -Recurse | Select-String "password"  # = grep -r

3.6 查找文件

# 按名称
Get-ChildItem -Path C:\ -Recurse -Filter "*.log" -ErrorAction SilentlyContinue

# 按大小(大于100MB)
Get-ChildItem C:\ -Recurse -File -ErrorAction SilentlyContinue |
    Where-Object {$_.Length -gt 100MB} |
    Sort-Object Length -Descending | Select-Object -First 10

# 按修改时间(最近7天)
Get-ChildItem C:\Users -Recurse -File -ErrorAction SilentlyContinue |
    Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-7)}

3.7 管道与重定向

# 对象管道
Get-Process | Where-Object {$_.CPU -gt 10} | Select-Object Name, CPU, Id

# 重定向
Get-Process > processes.txt        # 覆盖
Get-Process >> processes.txt       # 追加
Get-Process 2> errors.txt          # 只重定向错误
Get-Process 2>&1                   # 错误合并到输出
TIP

📌 $_ 是什么?管道中的当前对象变量。$_.CPU 就是"当前进程的 CPU 属性"。类似 JavaScript 箭头函数的参数。

📌 PowerShell 有 6 个输出流(Linux 只有 stdout + stderr):1=Success, 2=Error, 3=Warning, 4=Verbose, 5=Debug, 6=Information。可以分别重定向:3>&1 把警告合并到输出。

3.8 帮助系统

Get-Help Get-Process              # = man
Get-Help Get-Process -Examples    # 看示例
Get-Command *process*             # 搜索命令
Get-Command -Verb Get -Noun Item  # 按 动词-名词 搜索

4 · 用户与权限

图 4 \xb7 Windows 用户与权限模型

4.1 核心模型

Linux Windows
权限粒度 3组 × 3位 = 9个权限位 每用户/组独立,十几种权限
查看权限 ls -l icacls / Get-Acl
修改权限 chmod icacls / Set-Acl
超级用户 root (UID 0) Administrator + UAC

4.2 UAC(用户账户控制)

普通操作 → 用普通权限执行,无提示 需要管理员权限的操作 → 弹出 UAC 确认框 → 用户点"是" → 临时提升为管理员 → 用户点"否" → 操作被拒绝
TIP

📌 UAC 解决什么问题?Windows XP 时代用户习惯用 Administrator 账户,所有程序都拥有完全权限——恶意软件一运行就能改系统核心。UAC 让管理员平时以普通权限运行,需要提权时才确认。这就是为什么 Windows 7 后恶意软件大幅减少。

📌 为什么有些程序图标有盾牌标记?那个盾牌表示需要管理员权限。在命令行里用 Start-Process -Verb RunAs 以管理员权限启动。

4.3 用户管理命令

whoami                          # 当前用户
whoami /groups                  # 所属组
Get-LocalUser                   # 列出所有用户
New-LocalUser -Name "alice" -Description "Alice" -Password (Read-Host -AsSecureString)
Set-LocalUser -Name "alice" -Password (ConvertTo-SecureString "NewPass" -AsPlainText -Force)
Remove-LocalUser -Name "alice"
Add-LocalGroupMember -Group "Administrators" -Member "alice"
# CMD 方式:net user alice P@ssw0rd /add

4.4 文件权限(NTFS ACL)

icacls C:\test.txt                        # 查看权限
icacls C:\test.txt /grant alice:(F)       # 给 alice 完全控制
icacls C:\test.txt /grant Users:(RX)      # 给 Users 组读和执行
icacls C:\test.txt /remove alice          # 移除 alice 的权限
代码 含义 对应 Linux
F Full Control rwx
M Modify rw-
RX Read & Execute r-x
R Read r--
W Write -w-
TIP

📌 NTFS 权限继承:Windows 目录权限默认向下继承——给 C:\Projects 设了权限,里面所有子目录和文件自动继承。新文件也自动获得父目录权限。Linux 的 chmod -R 是一次性操作,新文件不受影响。要打破继承用 icacls /inheritance:d。


5 · PowerShell 脚本

图 5 \xb7 PowerShell 脚本执行流程

5.1 执行策略

Get-ExecutionPolicy             # 查看策略
Set-ExecutionPolicy RemoteSigned # 放开(需管理员)
# Restricted = 默认禁止脚本
# RemoteSigned = 本地可跑,远程需签名(推荐)
TIP

📌 为什么 PowerShell 默认禁止运行脚本?PowerShell 能力极强(调 .NET、操作注册表、远程执行),如果默认允许跑任何脚本,一封邮件附件的 .ps1 就能控制系统。所以默认 Restricted——你必须主动放开才能跑脚本,相当于安全闸。

5.2 变量

$name = "Tom"                    # 等号两边可以有空格(和 bash 不同!)
Write-Host "$name"               # 双引号:变量展开
Write-Host '$name'               # 单引号:原样输出
$count = 42                      # 整数
$items = @("apple", "banana")    # 数组
$person = @{Name="Alice"; Age=30}  # 哈希表
$today = (Get-Date).ToString("yyyy-MM-dd")  # 命令替换

5.3 条件判断

if (Test-Path C:\test.txt) {
    Write-Host "文件存在"
} elseif (Test-Path C:\test) {
    Write-Host "是目录"
} else {
    Write-Host "都不存在"
}
条件 含义
Test-Path $path 路径存在
$a -eq $b 等于
$a -gt $b 大于
$str -match "regex" 正则匹配
$str -like "wild*" 通配符匹配

5.4 循环

foreach ($i in 1..5) { Write-Host "数字 $i" }
foreach ($f in Get-ChildItem C:\Logs) { Write-Host "文件:$($f.Name)" }
for ($i = 0; $i -lt 5; $i++) { Write-Host $i }
Get-Process | ForEach-Object { if ($_.CPU -gt 10) { Write-Host $_.Name } }

5.5 函数

function Greet {
    param($name)
    Write-Host "Hello, $name"
    return $true
}
Greet -name "World"

5.6 实战:批量备份脚本

param([Parameter(Mandatory=$true)][string]$Source)
if (-not (Test-Path $Source)) { Write-Host "错误:$Source 不存在"; exit 1 }
$backup = "backup_$(Get-Date -Format 'yyyyMMdd_HHmmss').zip"
Compress-Archive -Path $Source -DestinationPath $backup
Write-Host "备份完成:$backup"

6 · 进程与服务管理

图 6 \xb7 Windows 进程管理

6.1 进程模型

Linux Windows
创建机制 fork() + exec() CreateProcess()(一步完成)
PID 1 systemd Session Manager
TIP

📌 为什么 Windows 没有 fork()?Linux 的 fork 是"复制自己再变身"两步走。Windows 的 CreateProcess 是"直接创建新进程"一步到位——传程序路径、参数、环境变量,直接创建。各有优劣:fork 的好处是中间能动手脚(重定向),Windows 用参数(STARTUPINFO)也能做到。

6.2 Get-Process — 查看进程

Get-Process                              # 所有进程
Get-Process chrome                       # 查找特定进程
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10  # CPU排名
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10  # 内存排名
列 含义 对应 Linux
Handles 句柄数 fd 数量
WS(K) 物理内存占用 RSS
CPU(s) 累计 CPU 时间 TIME
Id 进程 ID PID

6.3 tasklist / taskkill(CMD)

tasklist                        :: = ps aux
tasklist /fi "IMAGENAME eq chrome.exe"  :: 按名称过滤
taskkill /pid 1234              :: 礼貌终止(= kill 15)
taskkill /pid 1234 /f           :: 强制终止(= kill -9)
taskkill /im chrome.exe /f      :: 按名称杀(= pkill)

6.4 Stop-Process(PowerShell)

Stop-Process -Id 1234 -Force              # 强制杀
Get-Process chrome | Stop-Process -Force  # 按名称杀
TIP

📌 Windows 有信号机制吗?没有 Linux 那样的信号系统。taskkill(不带 /f)发 WM_CLOSE 消息,进程可保存数据后退出(类似 SIGTERM);taskkill /f 强制终止(= SIGKILL)。先礼后兵的思路一样。

6.5 后台作业

Start-Job -ScriptBlock { Start-Sleep 60; Write-Output "done" }
Get-Job
Receive-Job -Id 1
Wait-Job -Id 1
Remove-Job -Id 1

7 · 网络基础

图 7 \xb7 Windows 网络基础

7.1 TCP/IP 模型(与 Linux 完全通用)

层 作用 关键概念
应用层 具体应用协议 HTTP、SSH、DNS
传输层 端到端传输 TCP/UDP、端口号
网络层 跨网络寻址路由 IP 地址、路由
链路层 物理网络传输 MAC 地址、网卡
TIP

📌 网络知识跨平台通用。TCP 三次握手、IP 地址、端口、DNS——在 Windows 和 Linux 上完全一样,因为它们是协议标准。区别只在命令工具:Linux 用 ip/ss,Windows 用 ipconfig/netstat。

7.2 ipconfig — 查看网络

ipconfig                        # 基本信息
ipconfig /all                   # 详细信息(含DNS、MAC)
ipconfig /release               # 释放DHCP租约
ipconfig /renew                 # 重新获取IP
ipconfig /flushdns              # 清除DNS缓存

7.3 ping / tracert / netstat

ping 192.168.1.1                # 测试连通性(默认4包)
ping -t 192.168.1.1             # 持续ping(= Linux ping)
tracert 8.8.8.8                 # 路由追踪(= traceroute)
netstat -ano                    # 查看所有连接+PID(= ss -tlnp)
netstat -ano | findstr :80      # 查看80端口占用
TIP

📌 Windows ping 默认只发 4 个包就停了,Linux 是持续 ping 直到 Ctrl+C。Windows 要持续 ping 需加 -t 参数。这是历史习惯差异。

📌 netstat -ano 的 -o 显示 PID,可以定位是哪个进程占用了端口。Linux 用 ss -tlnp 达到同样目的。

7.4 curl / Resolve-DnsName

curl https://example.com                    # HTTP请求(Win10+内置)
Resolve-DnsName example.com                 # DNS查询(= dig)
Resolve-DnsName example.com -Server 8.8.8.8 # 指定DNS服务器

7.5 SSH(Win10+ 内置 OpenSSH)

ssh user@192.168.1.10            # 远程登录(和 Linux 完全一样)
scp file.txt user@host:/home/    # 远程复制
TIP

📌 Windows 10 开始内置 OpenSSH,不再需要 PuTTY。ssh、scp 命令和 Linux 完全一样。这是微软拥抱开源的标志之一。

7.6 hosts 文件

路径:C:\Windows\System32\drivers\etc\hosts

与 Linux /etc/hosts 功能完全相同——优先级高于 DNS,先查 hosts 再问 DNS 服务器。


8 · 软件包管理

图 8 \xb7 Windows 软件包管理

8.1 Windows 包管理的历史

时期 方式 对应 Linux
~2010 安装向导(.exe/.msi) 无(Linux 从诞生就有 apt)
2011 Chocolatey(社区) apt/dnf
2020 winget(微软官方) apt/dnf
TIP

📌 为什么 Windows 这么晚才有包管理器?Linux 是开源生态——所有软件都在仓库里,天然适合集中管理。Windows 是商业生态——每个软件厂商有自己的安装程序,各自为政。winget 相当于微软终于建了"超市",把分散的软件集中起来。

8.2 winget(微软官方,推荐)

winget search vscode             # 搜索软件
winget install Git.Git           # 安装(用Package ID)
winget list                      # 已安装列表
winget upgrade --all             # 升级所有
winget uninstall Git.Git         # 卸载

8.3 Chocolatey(社区,包更多)

choco install nodejs             # 安装
choco upgrade all                # 升级所有
choco uninstall nodejs           # 卸载
choco list --local-only          # 已安装

8.4 MSI 静默安装(无人值守)

msiexec /i package.msi /quiet /norestart    :: 静默安装
msiexec /x package.msi /quiet               :: 静默卸载
TIP

📌 msiexec 对应 Linux 的 dpkg -i——底层包安装工具。winget/choco 是高层工具(自动处理依赖),msiexec 是底层工具(装单个包)。和 apt/dpkg 的关系一样。


9 · Windows 服务

图 9 \xb7 Windows 服务管理

9.1 SCM(服务控制管理器)

Windows 的 SCM 相当于 Linux 的 systemd——管理后台服务的启动、停止、自启。

Linux systemd Windows SCM
管理器 systemd (PID 1) services.exe
配置 .service 单元文件 注册表 + SCM 数据库
查看服务 systemctl list-units Get-Service
启动/停止 systemctl start/stop Start/Stop-Service
开机自启 systemctl enable Set-Service -StartupType Automatic
查看日志 journalctl 事件查看器 (eventvwr.msc)

9.2 PowerShell 服务管理

Get-Service                              # 列出所有服务
Get-Service -Name *sql*                  # 按名称过滤
Start-Service -Name Spooler              # 启动服务
Stop-Service -Name Spooler               # 停止服务
Restart-Service -Name Spooler            # 重启服务
Set-Service -Name Spooler -StartupType Automatic  # 设为自动启动
Get-Service | Where-Object {$_.Status -eq "Running"}  # 只看运行中的

9.3 CMD sc 命令

sc query                         :: 列出所有服务
sc start Spooler                 :: 启动
sc stop Spooler                  :: 停止
sc config Spooler start= auto    :: 设为自动(注意=后有空格!)
sc create MySvc binPath= "C:\app.exe"  :: 创建服务
sc delete MySvc                  :: 删除服务
TIP

📌 sc 命令的怪异语法:start= auto 等号后面必须有空格。这是 sc 命令的历史遗留设计——它把 start= auto 解析为参数名 start 值 auto,等号只是分隔符不是赋值。

9.4 事件查看器(= journalctl)

日志类别 内容 对应 Linux
System 系统事件 /var/log/syslog
Application 应用事件 应用日志
Security 安全审计 /var/log/auth.log
Get-WinEvent -LogName System -MaxEvents 20           # 最近20条系统日志
Get-WinEvent -LogName System -Level 2                # 只看错误
Get-WinEvent -LogName Security -Id 4625              # 登录失败事件
TIP

📌 安全事件 ID 速查:4624=登录成功,4625=登录失败,4634=注销,4688=进程创建。对应 Linux 的 /var/log/auth.log 里的记录。


10 · 存储与磁盘管理

图 10 \xb7 Windows 存储与磁盘管理

10.1 存储栈:从磁盘到盘符

物理磁盘 → 分区 → 文件系统 → 盘符 → 用户访问 Disk 0 → Partition 1 → NTFS → C: → cd C:\
Linux Windows
分区表 GPT/MBR GPT/MBR
文件系统 ext4/xfs NTFS/ReFS
挂载方式 mount 到目录树 分配盘符
自动挂载 /etc/fstab 系统自动(盘符持久)
TIP

📌 Windows 用盘符代替挂载点。Linux 把磁盘"挂载"到目录树(如 /data),Windows 给磁盘分配盘符(如 D:)。思路不同:Linux 的方式更灵活(可以挂到任意位置),Windows 的方式更直观(用户一看盘符就知道)。

10.2 查看磁盘

Get-Disk                          # 物理磁盘
Get-Partition                     # 分区
Get-Volume                        # 卷信息
Get-PSDrive                       # 盘符和空间(= df -h)
fsutil volume diskfree C:         # C盘剩余空间

10.3 磁盘操作

Initialize-Disk -Number 1 -PartitionStyle GPT    # 初始化新磁盘
New-Partition -DiskNumber 1 -UseMaximumSize -DriveLetter D  # 创建分区
Format-Volume -DriveLetter D -FileSystem NTFS    # 格式化

10.4 diskpart(交互式磁盘工具)

diskpart
list disk
select disk 1
clean
create partition primary
format fs=ntfs quick
assign letter=D

10.5 VSS 卷影副本(= LVM 快照)

vssadmin list shadows             :: 查看快照
vssadmin create shadow /for=C:    :: 创建快照
TIP

📌 VSS 对应 Linux LVM 快照。Windows 的"还原以前的版本"功能底层就是 VSS——它给文件系统拍了某个时间点的快照,之后文件被改了也能恢复。Linux 用 LVM snapshot 或 ZFS/Btrfs 快照达到同样目的。

10.6 GPT vs MBR

MBR(旧) GPT(新)
最大磁盘 2TB >2TB
主分区数 4个 128个
冗余校验 无 有
配合 BIOS UEFI

新磁盘建议用 GPT。UEFI + GPT 是现代标准组合。


11 · 安全与防火墙

图 11 \xb7 Windows 安全与防火墙

11.1 Defender Firewall

Windows 防火墙默认开启(不像 Linux ufw 需要手动启用)。默认策略:入站阻止、出站允许。

Get-NetFirewallProfile                        # 查看防火墙状态
Set-NetFirewallProfile -Enabled True          # 启用防火墙
New-NetFirewallRule -DisplayName "HTTP" `
    -Direction Inbound -Protocol TCP `
    -LocalPort 80 -Action Allow               # 放行80端口
Get-NetFirewallRule | Where-Object {$_.Enabled -eq $true}  # 查看已启用规则

11.2 RDP 远程桌面安全

# 启用远程桌面
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server" `
    -Name fDenyTSConnections -Value 0
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
# 连接
mstsc /v:192.168.1.10
TIP

📌 RDP vs SSH:SSH(端口22)是命令行远程,RDP(端口3389)是图形远程。Linux 也有图形远程(VNC/X11 forwarding)但不如 RDP 流畅——因为 RDP 协议层面就为图形优化。建议限制 RDP 只允许特定 IP 访问。

11.3 安全检查清单

# 查看登录记录
Get-WinEvent -LogName Security -Id 4624    # 登录成功
Get-WinEvent -LogName Security -Id 4625    # 登录失败
query user                                 # 当前在线用户

# 检查可疑项
Get-NetTCPConnection -State Listen         # 监听端口
Get-Process                                # 可疑进程
Get-MpComputerStatus                       # Defender状态
TIP

📌 安全原则跨平台通用:最小权限(服务用低权账户)、最小开放(只开必需端口)、及时更新(Windows Update 打补丁)。和 Linux 安全原则完全一样,只是工具不同。


12 · 性能监控

图 12 \xb7 Windows 性能监控

12.1 四大资源

资源 Windows 工具 对应 Linux
CPU 任务管理器 / Get-Counter top / htop
内存 任务管理器 / systeminfo free -h
磁盘 I/O resmon / Get-Counter iostat / iotop
网络 resmon / netstat iftop / sar

12.2 性能计数器(= Linux /proc)

# CPU使用率
Get-Counter '\Processor(_Total)\% Processor Time'

# 磁盘I/O
Get-Counter '\PhysicalDisk(_Total)\% Disk Time'
Get-Counter '\PhysicalDisk(_Total)\Disk Write Bytes/sec'

# 网络流量
Get-Counter '\Network Interface(*)\Bytes Total/sec'

# 可用内存
Get-Counter '\Memory\Available MBytes'

12.3 综合工具

工具 打开方式 说明
任务管理器 Ctrl+Shift+Esc 一屏看CPU/内存/磁盘/网络
资源监视器 resmon 更详细,按进程看IO/网络
性能监视器 perfmon 计数器图表,长期监控
TIP

📌 性能排查方法论跨平台通用:① 看全局(任务管理器)→ 哪类资源紧张 → ② 针对该资源用专项工具 → 定位到具体进程 → ③ 分析该进程 → 看日志/调参/扩容。和 Linux 的思路完全一样。


13 · IIS 配置

图 13 \xb7 IIS 配置

13.1 IIS 是什么

IIS(Internet Information Services)是 Windows 自带的 Web 服务器,对应 Linux 的 Nginx。

IIS Nginx
平台 Windows only 跨平台
配置 GUI + XML 纯文本
ASP.NET 原生支持 需反向代理
反向代理 需装 ARR 模块 原生支持
负载均衡 应用池 upstream

13.2 安装 IIS

Install-WindowsFeature -Name Web-Server    # Server版
# 或:设置 → 应用 → 可选功能 → IIS

13.3 站点管理

New-Website -Name "MyApp" -PhysicalPath "C:\inetpub\myapp" -Port 8080
Start-Website -Name "MyApp"
Stop-Website -Name "MyApp"
Get-Website

13.4 配置文件

C:\Windows\System32\inetsrv\config\applicationHost.config # 主配置(XML) C:\inetpub\wwwroot\ # 默认网站根目录

用 inetmgr 打开 IIS 管理器(GUI)。

TIP

📌 IIS 的"应用池"对应 Nginx 的 upstream。每个应用跑在独立的工作进程(w3wp.exe)中,互相隔离。一个应用池崩溃不影响其他站点——这和 Nginx 的 worker 进程隔离思路类似。


14 · WSL 与容器

图 14 \xb7 WSL 与容器

14.1 WSL(Windows Subsystem for Linux)

wsl --install                    # 安装 WSL
wsl --list --verbose             # 列出发行版
wsl                              # 进入默认 Linux
wsl -d Ubuntu -- ls /home        # 指定发行版执行命令
wsl --shutdown                   # 关闭所有实例
TIP

📌 WSL1 vs WSL2:WSL1 是"翻译层"——把 Linux syscall 翻译成 Windows NT API,兼容好但有性能损耗。WSL2 是"真 Linux 内核"——跑在轻量 VM 里,完整兼容,接近原生性能。现在默认安装 WSL2。

📌 WSL 利用的是 Windows NT 的子系统架构。Windows NT 设计之初就支持多种子系统(OS/2、POSIX),WSL 就是加了一个 Linux 子系统。这是架构上的远见——30年前的设计在今天发挥了新价值。

14.2 Docker on Windows

winget install Docker.DockerDesktop    # 安装 Docker Desktop
# Docker Desktop 使用 WSL2 后端
docker pull nginx                      # 和 Linux 完全一样
docker run -d -p 8080:80 nginx
docker ps
docker images

14.3 文件互通

从 Windows 访问 WSL 从 WSL 访问 Windows
\\wsl$\Ubuntu\home\ /mnt/c/Users/hisos/
TIP

📌 VS Code Remote-WSL 是最佳实践:在 Windows 编辑 WSL 里的代码,用 Linux 工具链编译运行。两全其美——Windows 的 GUI 体验 + Linux 的开发环境。


15 · 常用系统技能

15.1 计划任务(= cron)

# 创建计划任务(每天凌晨3点执行)
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\backup.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At 3am
Register-ScheduledTask -TaskName "DailyBackup" -Action $action -Trigger $trigger

# 查看
Get-ScheduledTask -TaskName "DailyBackup"
# 删除
Unregister-ScheduledTask -TaskName "DailyBackup"
TIP

📌 计划任务对应 Linux 的 cron。Linux 用 crontab -e 编辑定时任务,Windows 用 Register-ScheduledTask 或 GUI(taskschd.msc)。思路一样——指定"什么时候执行什么命令"。

15.2 压缩与解压

Compress-Archive -Path C:\data -DestinationPath data.zip    # 压缩
Expand-Archive -Path data.zip -DestinationPath C:\data      # 解压
# 7z 需安装 7-Zip

15.3 环境变量

$env:PATH                       # 查看PATH
$env:MY_VAR = "hello"           # 临时设置
[Environment]::SetEnvironmentVariable("MY_VAR", "hello", "User")    # 永久设置(用户级)
[Environment]::SetEnvironmentVariable("MY_VAR", "hello", "Machine") # 永久设置(系统级,需管理员)

15.4 时间与时区

Get-Date                        # 当前时间
Set-Date -Date "2024-01-01 12:00:00"  # 设置时间
Get-TimeZone                    # 查看时区
Set-TimeZone -Id "China Standard Time"  # 设置时区
w32tm /resync                   # 同步时间(= ntpdate)

16 · 文本处理

16.1 Select-String(= grep)

Select-String "error" C:\Logs\app.log           # 搜索内容
Select-String "error" *.log -CaseSensitive      # 区分大小写
Get-ChildItem -Recurse | Select-String "password"  # 递归搜索(= grep -r)
Select-String "pattern" file.txt | Select-Object -First 5  # 只看前5个匹配

16.2 字符串操作(= sed/awk 的替代)

# 替换(= sed s/old/new/)
"hello world" -replace "world", "PowerShell"

# 分割(= awk -F: '{print $1}')
"a:b:c" -split ":"

# 提取
(Get-Content file.txt) -replace "old", "new" | Set-Content file.txt  # 原地替换

16.3 Get-Content + 管道(= cat | grep | wc)

# 统计行数(= wc -l)
(Get-Content file.txt).Count

# 查看最后10行(= tail -10)
Get-Content file.txt -Tail 10

# 实时追踪(= tail -f)
Get-Content file.txt -Wait
TIP

📌 PowerShell 文本处理 vs Linux 三剑客。Linux 有 grep/sed/awk 三个专用工具。PowerShell 用 Select-String(= grep)、-replace运算符(= sed)、-split运算符 + Where-Object(= awk)。没有专用工具,但用运算符和管道组合更统一。


17 · 系统启动流程

图 15 \xb7 Windows 系统启动流程

17.1 五个阶段

阶段 Windows 对应 Linux
① 固件 UEFI/BIOS BIOS/UEFI
② 引导 Windows Boot Manager GRUB
③ 加载内核 winload.efi → ntoskrnl.exe GRUB 加载 vmlinuz
④ 内核初始化 NT 内核 + 驱动 + 服务 kernel + systemd
⑤ 登录 用户配置文件/桌面 登录提示符/shell
TIP

📌 为什么需要 Boot Manager(鸡生蛋问题)。内核是磁盘上的文件,而"读取磁盘文件"本来是内核才会做的事——内核还没启动,谁来读它?所以需要一个极小、不依赖内核、能直接和固件/磁盘打交道的程序先上场。Windows 用 winload.efi(UEFI)或 winload.exe(Legacy BIOS),Linux 用 GRUB。思路完全一样。

📌 Windows 的 PID 1 不是 systemd。Windows 的第一个用户态进程是 Session Manager(smss.exe),它负责启动子系统、加载驱动。之后是 csrss.exe(Win32 子系统)、winlogon.exe(登录)。没有 Linux systemd 那样的统一服务管理——Windows 用 SCM 独立管理服务。

17.2 安全模式(= Linux rescue.target)

设置 → 恢复 → 高级启动 → 启动设置 → 重启 → 按4进入安全模式

或命令行:

bcdedit /set {current} safeboot minimal

17.3 排查启动问题

bcdedit /enum                                    # 查看启动配置
Get-Service | Where-Object {$_.StartType -eq "Automatic" -and $_.Status -ne "Running"}  # 启动失败的服务
Get-WinEvent -LogName System -Level 2            # 系统错误日志

总结:Windows vs Linux 知识地图

主题 Windows Linux
内核 NT 混合内核 宏内核
Shell PowerShell(面向对象) bash(面向文本)
包管理 winget / Chocolatey apt / dnf
服务管理 SCM / Get-Service systemd / systemctl
存储挂载 盘符 C: D: 目录树 mount
权限 NTFS ACL + UAC rwx + sudo
防火墙 Defender Firewall ufw / firewalld
性能监控 任务管理器 / perfmon top / htop
Web 服务器 IIS Nginx
容器 WSL2 + Docker Desktop Docker
文本处理 Select-String / -replace grep / sed / awk
启动流程 UEFI → Boot Manager → winload → NT Kernel BIOS → GRUB → kernel → systemd
日志 事件查看器 journalctl
远程 RDP (3389) SSH (22)
计划任务 Task Scheduler cron
TIP

📌 学 Windows 的最佳策略:对照 Linux 学。你已经会 Linux,Windows 的每个概念都能在 Linux 找到对应。记住对照关系,就能快速上手。核心差异只有三点:① PowerShell 面向对象 vs bash 面向文本;② 盘符 vs 单根目录树;③ 注册表 vs /etc 文本配置。


附录 A:命令速查手册

A.1 文件操作

操作 PowerShell CMD Linux
列目录 Get-ChildItem dir ls
切换目录 Set-Location cd cd
当前路径 Get-Location cd pwd
创建目录 New-Item -ItemType Directory mkdir mkdir
复制 Copy-Item copy cp
移动 Move-Item move mv
删除 Remove-Item del rm
查看内容 Get-Content type cat

A.2 系统管理

操作 PowerShell CMD Linux
进程列表 Get-Process tasklist ps aux
杀进程 Stop-Process -Id PID -Force taskkill /pid PID /f kill -9 PID
服务列表 Get-Service sc query systemctl list-units
启动服务 Start-Service Name sc start Name systemctl start Name
磁盘空间 Get-PSDrive wmic logicaldisk df -h
网络配置 ipconfig /all ipconfig /all ip a
端口占用 Get-NetTCPConnection netstat -ano ss -tlnp

A.3 网络工具

操作 Windows Linux
查IP ipconfig ip a
ping ping -t host ping host
路由追踪 tracert traceroute
DNS查询 Resolve-DnsName dig
端口查看 netstat -ano ss -tlnp
HTTP请求 curl curl
远程登录 ssh user@host ssh user@host
远程桌面 mstsc /v:host —

附录 B:自测题与闪卡

B.1 高频闪卡

问题 答案
Windows 内核类型? 混合内核(NT)
PowerShell 管道传什么? 对象(.NET 对象),不是文本
Windows 包管理器? winget(官方)/ Chocolatey(社区)
Windows 的 systemd 叫什么? SCM(服务控制管理器)
Windows 防火墙默认状态? 开启(入站阻止、出站允许)
Windows 的 journalctl? 事件查看器(Get-WinEvent)
Windows 的 cron? Task Scheduler(计划任务)
WSL2 用什么内核? 真正的 Linux 内核(轻量 VM)
Windows 的 /etc? 注册表(集中式配置数据库)
Windows 的 /home? C:\Users<用户名>
PowerShell 默认执行策略? Restricted(禁止脚本)
Windows 的 root? Administrator + UAC 提权
Windows 的 kill -9? taskkill /pid PID /f
Windows 的 grep? Select-String
Windows 的 df -h? Get-PSDrive
RDP 端口? 3389
Windows 启动引导器? Windows Boot Manager(= GRUB)
NTFS 权限模型? ACL(每用户独立配置,十几种权限位)

B.2 简答题

  1. Q: PowerShell 和 bash 管道有什么本质区别? A: bash 管道传文本流,下游用 grep/awk 解析文本。PowerShell 管道传 .NET 对象,下游直接访问属性 $_.CPU,不需要切列解析。

  2. Q: UAC 解决了什么问题? A: Windows XP 时代用户都用 Administrator 账户,恶意软件一运行就有完全权限。UAC 让管理员平时以普通权限运行,需要提权时弹窗确认,减少了恶意软件的静默提权。

  3. Q: WSL2 和 WSL1 的区别? A: WSL1 是 syscall 翻译层(Linux syscall → NT API),兼容好但性能有损耗。WSL2 跑真正的 Linux 内核(轻量 VM),完整兼容,接近原生性能。

  4. Q: Windows 为什么用盘符而不用单根目录树? A: 历史 reasons——继承 DOS 的盘符设计(A: B: 给软盘,C: 开始给硬盘)。Linux 的单根树更优雅,但盘符对普通用户更直观。


附录 C:实战项目

项目:部署一个 Windows Web 服务器

目标:在 Windows Server 上部署 IIS + ASP.NET 应用,配置防火墙和监控。

步骤:

  1. 安装 IIS
Install-WindowsFeature -Name Web-Server
  1. 部署应用
New-Website -Name "MyApp" -PhysicalPath "C:\inetpub\myapp" -Port 8080
Start-Website -Name "MyApp"
  1. 配置防火墙
New-NetFirewallRule -DisplayName "HTTP-8080" `
    -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow
  1. 设置日志监控
# 查看IIS日志
Get-Content C:\inetpub\logs\LogFiles\*\*.log -Tail 20 -Wait
# 查看系统事件
Get-WinEvent -LogName System -MaxEvents 10
  1. 创建备份计划任务
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-File C:\backup-iis.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At 2am
Register-ScheduledTask -TaskName "IISBackup" -Action $action -Trigger $trigger
  1. 验证
curl http://localhost:8080
Get-NetTCPConnection -LocalPort 8080
Get-Service W3SVC
TIP

📌 这个项目串联了 IIS 配置(13章)、防火墙(11章)、性能监控(12章)、计划任务(15章)、日志查看(9章)——把所学知识串起来用。

本页目录