news 2026/9/13 4:59:20

从状态查看到规则管理:用netsh与PowerShell玩转Windows防火墙

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从状态查看到规则管理:用netsh与PowerShell玩转Windows防火墙

手头正好帮朋友处理了一台 Windows Server 的网络故障,服务端口被防火墙挡住,客户端怎么都连不上。以前遇到这种情况,我多半是打开“高级安全 Windows 防火墙”那个窗口一层层点,找规则、看状态、改配置,眼睛都能花掉。这次远程连过去,我直接在管理员命令行里敲了一句netsh advfirewall show allprofiles,三秒钟看清三个配置文件的实时状态,接着一两条命令就把问题定位了。从 Win7 时代我就开始用命令行折腾 Windows 防火墙,后来在 Server Core 无桌面环境、批量部署场景里,这条路径更是成了唯一选择。这篇把从防火墙状态查看、启用禁用,到出站入站规则、批量脚本的完整玩法都理一遍,给运维、开发、以及想管住软件偷偷联网的普通用户一份可以直接照抄的操作手册。

1. 为什么盯着命令行不放:防火墙管理的四个真实场景

1.1 GUI 够用,但命令行在这些场景里不可替代

Windows 防火墙的图形界面做得并不差,wf.msc打开的高级安全控制台甚至能监控规则命中情况,但它在四个真实场景里完全不顶用。

第一个是批量部署。你刚给二三十台新机器装完系统,需要统一把防火墙打开、放行某些管理端口、把默认入站策略调成阻止,如果一台一台开窗口点鼠标,整个下午就没了。命令行可以直接塞进无人值守安装脚本、开机脚本或者配置管理工具里,一次性把几十台全部处理完。

第二个是 Server Core 这类无桌面环境。Windows Server 在 Core 模式下装完就是一个黑窗口,wf.msc根本打不开,防火墙管理全靠netsh advfirewall和 PowerShell 命令。你要在这种环境里部署服务,绕不开命令行。

第三个是远程排障。RDP 断断续续、带宽极低的时候,你不可能还指望图形界面;反而是一条sc query mpssvc或者netsh advfirewall show currentprofile,输出极短,瞬间就能判断服务状态和防火墙开关。

第四个是可复制、可审计。GUI 里点过的每一步都没法追溯,而命令天然是文本,可以写进笔记、放进脚本、贴到工单里,下次遇到一模一样的问题直接复制粘贴。这种“可复制性”在运维里价值极高,实际操作一次就知道有多香。

1.2 两条技术路线怎么选:netsh 还是 PowerShell

管理 Windows 防火墙主要有两条命令行路线:老牌的netsh advfirewall和较新的 PowerShellNetSecurity模块。我两个都常用,它们背后的服务是同一个,只是操作界面不一样。

维度netsh advfirewallPowerShell NetSecurity
适用系统Windows 7 到 Windows 11、Server 全系Windows 8 / Server 2012 及以后
核心命令netsh advfirewall set/showGet/Set/New/Remove-NetFirewall*
输出格式纯文本,适合快速人眼查看对象化,适合筛选、排序、再加工
脚本友好度中,批处理里直接写高,配合管道和变量非常灵活
典型使用场景快速开关、一次性查询、老系统兼容批量规则操作、条件查询、自动化编排

选型其实很简单:只是想快速看状态、开关防火墙、加一条端口规则,netsh advfirewall最短平快,随处可用不需要加载模块;如果要做复杂的批量操作、按条件筛选规则、动态生成规则,那一定是 PowerShell 更顺手。实际运维中我也经常混用,先netsh advfirewall快速看全局,再切到 PowerShell 做精细操作。新版 Windows 执行部分 netsh 命令时偶尔会提示“该命令已弃用”,但netsh advfirewall这一组至今仍能正常工作,老教程里那种不带advfirewallnetsh firewall命令才是真正该淘汰的,下面避坑部分会单独讲。

2. 启用与禁用防火墙:最常用命令全集

2.1 先学会查状态,别上来就乱改

不管要开还是要关,第一步永远是查当前状态。这听起来像废话,但我真见过有人不看状态直接敲禁用命令,结果本来防火墙就没开,白忙活半天。查状态有两种方式:

# 查看所有配置文件状态 netsh advfirewall show allprofiles # 只看当前网络所在的配置文件 netsh advfirewall show currentprofile

执行后输出大概是这样的(中文系统显示中文策略名):

域配置文件设置: 状态 启用 入站连接操作 阻止 出站连接操作 允许 专用配置文件设置: 状态 启用 入站连接操作 阻止 出站连接操作 允许 公用配置文件设置: 状态 启用 入站连接操作 阻止 出站连接操作 允许

PowerShell 对应的查法更结构化工整一点:

Get-NetFirewallProfile | Select-Object Name, Enabled

我个人更喜欢先执行show allprofiles,因为它一次把三个配置文件的开关状态和默认入站、出站策略全显示出来,比单看一个 Enabled 字段信息量更大。这里有个小细节:防火墙状态除了“启用/关闭”,还有第三种值叫notconfigured,意思是“未专门配置过”,此时系统按默认策略处理,通常等同于启用。不过本地组策略可能把它重新定义成别的值,所以看到 notconfigured 别慌,先看最终生效状态。

2.2 启用和禁用的正确姿势

最核心的两条命令,全局一次性管住三个配置文件:

# 启用所有配置文件(域/专用/公用) netsh advfirewall set allprofiles state on # 禁用所有配置文件 netsh advfirewall set allprofiles state off

命令执行完会回一个“确定。”或者“Ok.”的反馈,没有任何多余信息。很多人第一次看到只有一个“Ok.”还以为命令没生效,其实已经执行完了,可以用 2.1 里的 show 命令确认。

实际业务中,我更推荐按配置文件分开操作,而不是动不动全局关。比如一台同时插着公司内网网线和公共 Wi-Fi 的笔记本,你只想把公用网络上的防火墙关掉(虽然我不建议),域和专用的保持开启:

# 只关闭公用网络配置文件 netsh advfirewall set publicprofile state off # 只开启域配置文件 netsh advfirewall set domainprofile state on

PowerShell 的对应写法稍微抽象一点,但逻辑更清晰:

# 全局启用 Set-NetFirewallProfile -Profile Domain, Private, Public -Enabled True # 全局禁用 Set-NetFirewallProfile -Profile Domain, Private, Public -Enabled False # 只禁用公用网络 Set-NetFirewallProfile -Profile Public -Enabled False

注意 PowerShell 里-Profile参数可以接收多个值,用逗号分隔即可;如果只想操作当前生效的配置文件,可以先Get-NetConnectionProfile查出来再传给Set-NetFirewallProfile,这里不过度展开,后文有完整示例。

还有一条容易被忽略的命令,把防火墙恢复到“系统从未配置过”的状态:

netsh advfirewall set allprofiles state notconfigured

这个状态不是“开启”也不是“关闭”,而是把决定权交还给默认策略或组策略。如果你用脚本改乱了,又不知道当时系统默认是什么,这一句能把你从坑里拉出来。

2.3 三个配置文件到底有什么区别

很多初学者看到 domain、private、public 三个配置文件就懵,我用人话解释一下。Windows 7 开始,系统允许同时存在多套完全独立的防火墙配置,每套配置叫一个“配置文件”,分别对应一种网络环境:

  • 域配置文件:网卡成功加入域网络时生效,主要出现在企业环境,由域控认证过的网络连接。
  • 专用配置文件:你把当前网络标记为“专用网络”时生效,通常用于家里、公司内部这类你信任的网络。
  • 公用配置文件:默认值,连接到新网络且未手动标记时用这个,适用机场、酒店、咖啡厅这些公共 Wi-Fi。

核心逻辑是,你在家里允许打印机共享、允许远程桌面,但到了公共 Wi-Fi 上这些同样配置不应该生效。所以 Windows 才拆分出多套策略。查看当前电脑的网络属于哪个配置文件,最快的方法是:

Get-NetConnectionProfile | Select-Object Name, InterfaceAlias, NetworkCategory

日常最该盯紧的是 Public 配置文件,因为它覆盖的是安全性最差的那类网络。如果公司域策略没统一收口,我的习惯是 Public 配置文件保持默认严格策略,不在上面额外开任何端口。

3. 从“开关防火墙”到“管规则”:真正常用的玩法

3.1 放行端口与程序的规则怎么写

只开关防火墙在工作里远远不够,更多时候我们是要放行某个端口或某个程序。举例:我在一台 Windows Server 上部署了一个 Tomcat 服务,监听 8080 端口,但服务器之间装有防火墙,外部访问被默认入站策略拦住了。这时加一条放行规则:

netsh advfirewall firewall add rule name="Allow Tomcat 8080" dir=in action=allow protocol=TCP localport=8080

这条命令拆开看就很好理解了:name是规则显示名,dir=in表示入站方向,来源是外部访问我方 8080 端口;action=allow是“放行”;protocol=TCP指定 TCP 协议;localport=8080指定本地端口。与其对应的出站方向命令,把dir=in换成dir=out即可。

PowerShell 同样的事这样写:

New-NetFirewallRule -DisplayName "Allow Tomcat 8080" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 8080 -Profile Any

这里我额外加了-Profile Any,意思是规则对域、专用、公用三个配置文件全部生效。如果不加,新版系统默认可能只在部分配置文件生效,这是非常容易踩的细节。如果只想放行某个程序而不是固定端口,用-Program "C:\xxx\app.exe"替代-Protocol TCP -LocalPort 8080即可。按端口放行适合无状态的服务端口,按程序放行适合那些动态端口、写死的程序路径,两者各有适用场景。

3.2 拦一个软件出站联网:出站规则实战

端口规则大家都熟,真正让命令行价值凸显的,是出站方向的黑名单拦截。我之前看到有朋友问“防火墙阻止 geekuninstaller.exe 出站联网,怎么配置才最推荐,还不改程序文件”。这个问题本质上是:某个软件频繁联网,可能是更新、弹广告、上报数据,你想把它拦下来,又不想去改程序文件、破解或者破坏签名。这时候用 Windows 防火墙出站规则拦截,是最干净、最可逆、不碰程序文件的方案。

命令如下:

netsh advfirewall firewall add rule name="Block GeekOut" dir=out action=block program="C:\Program Files\GeekUninstaller\geek.exe" enable=yes

同样的需求,比如给 Acrobat 建规则屏蔽联网,有人会写成入站加出站双方向一起拦:

netsh advfirewall firewall add rule name="Block Acrobat In" dir=in action=block program="C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe" netsh advfirewall firewall add rule name="Block Acrobat Out" dir=out action=block program="C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe"

实际操作里,拦软件联网绝大多数只需要出站方向,毕竟软件的连接行为是从本机向外发起的。但你说的那种“彻底屏蔽某个软件和外界的连接”,把入站也一起挡上也不是坏事。这里有个细节:如果软件通过 svchost 或者后台服务代发请求,光拦主程序路径不一定能拦住,还需要额外拦代理进程,比如 Java 类程序就得看具体的 javaw.exe 路径。所以要真正判断规则有没有生效,用后文实操章节的命令查规则列表,甚至去安全日志翻过滤平台的拦截图。

PowerShell 的写法也不难:

New-NetFirewallRule -DisplayName "Block GeekOut" -Direction Outbound -Action Block -Program "C:\Program Files\GeekUninstaller\geek.exe" -Profile Any

新增规则默认是启用状态,不用额外参数。要不要再把这条规则也应用到入站方向,我的建议是:你只为了禁止它访问网络,出站方向已经足够,入站加不加影响不大;但如果你是防御思路,宁可多拦,那就双方向一起写。

3.3 规则的搜索、删除、导出导入

规则建多了以后,管理才是重点。查某一条规则是否存在:

netsh advfirewall firewall show rule name="Block GeekOut"

如果记不清名字,可以列全部规则,然后用 findstr 过滤:

netsh advfirewall firewall show rule name=all | findstr /i "Block"

PowerShell 在这方面顺手得多,可以按方向、动作、名称做结构化筛选:

# 列出所有出站拦截规则 Get-NetFirewallRule -Direction Outbound -Action Block | Select-Object DisplayName, Enabled, Profile # 按关键字找规则 Get-NetFirewallRule | Where-Object { $_.DisplayName -like "*Geek*" } | Select-Object DisplayName, Enabled

删除规则也有讲究。netsh advfirewall firewall delete rule name="Block GeekOut"会把这个名字下所有方向的规则都删掉。如果同名规则有多条,建议再限定方向,比如:

netsh advfirewall firewall delete rule name="Block GeekOut" dir=out

PowerShell 删除更安全:

Get-NetFirewallRule -DisplayName "Block GeekOut" | Remove-NetFirewallRule -Force

这里真的要提醒一句:删规则前先想想这规则是谁创建的。如果是你自己加的实验规则,删了无所谓;如果是部署脚本统一派发的,删了之后下次脚本一跑又回来了。最稳妥的做法不是删,而是先Set-NetFirewallRule -DisplayName "Block GeekOut" -Enabled False禁用掉,观察系统行为正常后再动手删除。

备份和恢复是整个规则管理里最容易被忽略的一环。改规则数量较多之前,强烈建议先导出一次:

netsh advfirewall export "D:\backup\firewall-policy-20250101.wfw"

需要恢复时再导入:

netsh advfirewall import "D:\backup\firewall-policy-20250101.wfw"

导出的.wfw是 XML 格式,内容包含本地规则和策略设置,导入会覆盖当前策略。我自己的习惯是每次大改前先导出,命名里带日期,导出后看一眼文件大小不是 0 KB 才继续动手。这个习惯帮我在两组冲突规则中恢复过两次,比任何“撤回”功能都靠谱。

4. 批量运维与脚本化:让防火墙管理自动化

4.1 一条命令搞定一台机的安全基线

命令行最大的优势从来不是单机操作,而是批量复制。我之前给一批内网测试机做安全基线,要求是:关闭不必要的入站放行、保持出站默认允许、把 22/3389/443 这些管理端口放行、其他入站一律阻止。一条一条命令敲太慢,直接写一个批处理脚本:

@echo off rem 用管理员权限运行 echo [1/4] 重置防火墙策略到默认值 netsh advfirewall reset echo [2/4] 设置默认入站阻止、出站允许 netsh advfirewall set allprofiles firewallpolicy blockinbound,allowoutbound echo [3/4] 开启所有配置文件 netsh advfirewall set allprofiles state on echo [4/4] 放行管理端口 netsh advfirewall firewall add rule name="Open SSH" dir=in action=allow protocol=TCP localport=22 netsh advfirewall firewall add rule name="Open RDP" dir=in action=allow protocol=TCP localport=3389 netsh advfirewall firewall add rule name="Open HTTPS" dir=in action=allow protocol=TCP localport=443 echo 完成

这段脚本每行都很平庸,但组合起来就是一台机器的安全基线。注意第一行的netsh advfirewall reset会把系统自带的所有自定义规则清空,恢复到默认安装状态,所以一定要在脚本开头用,并且确定这台机器上没有已经存在的关键规则,否则必须先用 export 备份。对纯新机器来说,这个顺序刚好。部署完一台机器,把脚本复制到下一个环境,完全不用思考,效率极高。

4.2 PowerShell 批量规则:一波操作顶半小时

如果真的有一批程序需要统一拦截出站,手动一条一条 add rule 也累。我写过一个小脚本,从一个文本文件里读取所有程序绝对路径,再循环创建同名出站拦截规则。

$blockList = Get-Content "C:\blocklist.txt" $index = 0 foreach ($line in $blockList) { $trimmed = $line.Trim() if ($trimmed -eq "" -or $trimmed.StartsWith("#")) { continue } $index++ $ruleName = "BlockByList_{0}" -f $index try { New-NetFirewallRule -DisplayName $ruleName -Direction Outbound -Action Block -Program $trimmed -Profile Any -ErrorAction Stop | Out-Null Write-Host "已创建规则: $ruleName -> $trimmed" } catch { Write-Host "失败: $trimmed ($_)" } }

文件中每行一个完整路径,以#开头的行作为注释会被跳过。脚本会自动跳过空行,遇到无效路径会继续执行并把错误打在屏幕上,不会因为某一条失败就中断整批操作。这条脚本我后来被同事拿去魔改,加上了按协议、按远程端口拦截的版本。思路是通的,规则参数从文本里读,真正做到了“规则即代码”。

4.3 远程与无界面环境下的补充手段

Server Core 没界面,网络安全合规检查又必须开机防火墙,这时候远程批量管理防火墙就成了标配。只要目标机器开了 WinRM,本机管理员就可以用 PowerShell 直接操作:

$servers = "SERVER01", "SERVER02", "SERVER03" Invoke-Command -ComputerName $servers -ScriptBlock { Set-NetFirewallProfile -Profile Public -Enabled True Get-NetFirewallProfile | Select-Object Name, Enabled }

这个场景在内网运维里很常见,但前提是 WinRM 本身没被防火墙挡住,毕竟你要管的恰恰是防火墙自己。如果机器还没有开放 WinRM,又必须远程操作,那只能靠带外管理卡或者本机控制台,这个不在本文范围,但原理要清楚。

另外,命令行不是永远黑漆漆的,它也可以“叫醒” GUI。输入wf.msc可以直接打开高级安全 Windows 防火墙管理控制台,输入firewall.cpl可以打开控制面板的防火墙设置页。这两个命令在批处理和运行框里都能用,用来给图形界面补充入口,很多老运维反而一直靠这个快速唤起界面,省得一层层点“开始菜单”。

5. 常见问题与避坑实录

5.1 权限不足的提示长什么样

命令行操作防火墙,几乎所有“改状态、改规则”的动作都需要管理员权限。不提升权限时,系统经常只给一句轻飘飘的错误:

请求的操作需要提升。

或者英文版的:

The requested operation requires elevation.

又或者直接提示“拒绝访问”。我会直接告诉你:别琢磨怎么绕过这个限制,正确做法是用管理员身份打开命令行。鼠标右键“以管理员身份运行”是最低成本的方案;在 Windows 10/11 里还可以按 Win + X 选择“终端(管理员)”直接开一个新终端。批处理脚本同样要右键管理员运行,或者加一个自提权的前缀代码,否则脚本里第一条需要权限的命令就会失败,而失败的提示又不够醒目,容易被忽略。

5.2 执行成功了但状态没变

这是读者问得最多的一个问题。命令行明明回了一句“确定。”,但回到 GUI 一看,防火墙还是原来的状态。经验告诉我,主要就三种原因。

第一种是组策略锁定了防火墙配置。在域环境或者被“公共控制台”管着的机器上,本地设置的优先级低于组策略。你可以先用gpresult /r看看这台机器是否应用了防火墙相关策略,再打开注册表检查:

reg query "HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\StandardProfile"

如果看到EnableFirewall值为 0 或 1,说明策略把它固定死了,此时要改的是策略源,而不是本地命令。对单机用户来说,最常见的触发点是某些“安全优化工具”往这个位置写了策略值,把防火墙锁成了禁用,这时候命令行写不回去也就顺理成章了。

第二种是第三方安全软件接管了防火墙。比如 360、火绒、企业 EDR 等安全软件,它们会在系统防火墙之外再搭一层,甚至会接管或锁定系统防火墙的状态。它们界面上显示的是自己的“防火墙开关”,实际控制了底层过滤引擎的某些部分。这种环境里,命令行设置的规则也许能建,但它是否真的生效,得看安全软件的脸色。

第三种是基础服务没跑起来。Windows Defender 防火墙依赖mpssvc服务,这个服务被禁用后,所有防火墙界面和命令都会异常。查服务状态:

sc query mpssvc

正常情况返回的 STATE 应该是RUNNING。如果看到STOPPED或者启动类型是DISABLED,先把它恢复自动并启动。虽然现在启动 mpssvc 命令本身也要求管理员权限,但至少比对着一个“状态永远不变”的界面干瞪眼强。

5.3 老命令变成历史后怎么办

市面上大量老教程还在教netsh firewall set opmode disable这种远古写法。这是 Windows XP / Server 2003 时代的命令,从 Windows Vista 和 Windows 7 开始,正确的命名空间是netsh advfirewall。新版系统里执行老命令时,系统会提示:

此命令在 Windows 防火墙的当前版本中已弃用。

甚至可以明显感觉到,一些 Windows 11 新版本上老命令的参数已经不那么好使了。顺着版本演化梳理一下:

  • Windows XP/2003:netsh firewall set opmode disable
  • Windows Vista/7 至今:netsh advfirewall set allprofiles state on/off

如果你在写新脚本,尽量优先用 PowerShell 的Set-NetFirewallProfile等 cmdlet,语法更清晰,也更贴近当前技术栈。netsh 则适合在老系统、批处理、应急排查时快速敲两下。跨版本脚本往往二者并用,写一个统一入口封装函数,内部根据系统版本决定调用哪种命令,是运维工程化的常规做法。

5.4 完全禁用防火墙前,先想清楚这几点

说实话,命令行能让你一秒关防火墙,但“能不能关”和“该不该关”是两回事。我见过不少运气很好的“关闭党”,在隔离内网、有前置防火墙、机器上没敏感数据的实验环境里关了半年没出过事,于是一路关到底。运气差一点的,一台机器挂着数据库暴露在公网,防火墙一封,没出两周就被扫描到并种了挖矿程序。

我的建议是分情况处理:

  • 隔离实验网:可以临时关,但限定时间段,调试完立刻恢复state on
  • 公网/半公网环境:绝不整体关。真要调试,优先加放行规则。
  • 内网高安全要求区域:不建议整体关,管理员可以参考“黑白名单”思路做收敛。

所谓的“黑白名单”思想放到 Windows 防火墙上,是这样的两派做法:黑名单模式是默认放行,只封掉明确不允许的程序(例如 3.2 节里拦 geek.exe、Acrobat.exe 的出站规则),好处是省事,日常软件不受影响;白名单模式是默认全部拦截,只放行明确允许的程序和端口,好处是安全强度高,代价是需要不断维护白名单,否则新装的软件极可能无法联网排障。

命令行怎么改默认放行策略呢?用这条:

# 默认入站阻止、出站允许(Windows 默认行为) netsh advfirewall set allprofiles firewallpolicy blockinbound,allowoutbound # 如果要严格白名单:入站出站都默认阻止 netsh advfirewall set allprofiles firewallpolicy blockinbound,blockoutbound

设置成blockoutbound后,绝大多数软件都会断网,必须靠规则逐条放行。这种模式的维护成本不低,普通个人用户不建议轻易尝试,企业合规要求严格时会用。我个人更推荐折中方案:默认策略保持 Windows 原样,把需要屏蔽的软件出站规则批量建好,既能起到黑名单的管控效果,又不至于把自己日常使用逼疯。

命令行操作防火墙的另一个隐性福利是“可审计”:每条规则都有名字、方向、动作、程序路径,随时可以用show rule name=all导出全部规则清单,甚至放到自己知识库里做存档。操作之前先 export 一份,操作之后又能随时 diff 出到底改了什么。这些流程在 GUI 环境里很难做到,而在命令行环境里只是几条命令的事。

回到最开始那台服务器:最后我执行的是netsh advfirewall firewall add rule name="Allow App" dir=in action=allow protocol=TCP localport=9000,服务立刻被客户端访问通了。整个过程没有打开任何一个 GUI 窗口,却比鼠标点来点去快了一倍不止。根据我个人经验,真正把命令行防火墙玩顺手之后,最受益的反而不是那些炫酷的批量操作,而是每次排障时那种“想要什么信息,随手就能查出来”的掌控感。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 4:58:35

弗洛伊德升华理论:本能冲动与创造性转化

1. 弗洛伊德升华说的理论框架弗洛伊德的升华理论(Sublimation)是其精神分析学说中关于心理防御机制的重要组成部分。这个概念最早出现在他1905年出版的《性学三论》中,后来在《文明及其不满》等著作中得到进一步发展。升华指的是将本能的冲动,特别是性本…

作者头像 李华
网站建设 2026/9/13 4:58:25

Java面向对象进阶:包、代码块、抽象类、接口、内部类实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 4:54:58

小分子串联质谱(MS/MS)库构建与应用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 4:53:58

DeepSeek-V4.1-Flash:552B MoE与1M上下文的工程落地实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华