/execute 执行命令
以其他实体的身份、位置或维度执行命令,支持条件判断
基岩版最强大的命令,用于改写一条命令的执行上下文(执行者、位置、角度、维度),并为其附加条件判断。基岩版 1.19.50 起本命令被彻底重写,旧版 execute <目标> <位置> [detect ...] 语法已弃用,改为与 Java 版一致的子命令链语法。
原理
/execute 本身不改变世界里的任何方块或实体,它只做一件事:在内存中改写一条命令的「执行上下文」。任何命令在执行时都携带一组上下文信息,包括执行者(谁在跑这条命令、@s 指向谁)、执行位置、朝向角度和所在维度。当你在聊天栏输入命令时,执行者是你本人,位置是你的坐标;当命令从命令方块发出时,命令没有执行者,位置落在命令方块上。/execute 就是在这组上下文被最终命令读取之前,逐项修改它的工具。
子命令按书写顺序从左到右依次生效,后一个子命令基于前一个的结果继续修改上下文,最后一个 run 才真正触发目标命令。关键机制在于 as、at、positioned as、rotated as、facing entity 这些接受目标选择器的子命令:当选择器匹配到多个实体时会发生「执行分叉」,命令流分裂成与匹配实体数量相同的分支,每个分支携带一份独立的上下文副本,后续子命令和 run 会在每个分支上各执行一次。这正是 @s 能「依次指代每个实体」的底层原因——@s 只是一个动态引用,它在执行时解析为当前分支上下文里的执行者,而 as 改写了这个字段,at 则只改位置、不改执行者。
if/unless 是把命令变成「判定器」的子命令。它们在当前上下文里求值一个条件:if 在条件为真时继续,unless 在条件为假时继续;一旦判定失败,链条从这里截断,后面的所有子命令和 run 都不会执行,整条命令以失败返回。这个成功/失败信号不仅影响命令输出,还会被条件命令方块读取——条件命令方块会检查指向它的命令方块在上一游戏刻是否执行成功,因此 execute if ... 可以单独作为条件命令方块的判定前置,替代旧版的 /testfor、/testforblock、/testforblocks。
旧版 /execute 把执行者和位置强制绑定在一起,语法是 execute <目标> <位置> <命令>,条件判断只能靠追加的 detect 完成,而 detect 是基岩版独有写法。基岩版 1.19.50 借鉴 Java 版重写了整套语法,把「执行者、位置、角度、维度、条件」拆成可任意组合的子命令,让执行者与位置彻底解耦,这是本命令能支撑几乎所有复杂命令系统的结构基础。
语法
新版语法(1.19.50+):
/execute <子命令>... run <命令>
其中 <子命令> 可以是 as、at、positioned、rotated、in、anchored、facing、align、if、unless 中的任意一个或多个。子命令按顺序链式组合,run 放在最后触发最终命令;run 可以省略,此时整条命令返回最后一个条件的判定结果。
旧版语法(1.19.50 以下):
/execute <目标> <位置> <命令>
/execute <目标> <位置> detect <检测位置> <方块> <数据值> <命令>
旧版把执行者与位置绑定,条件判断只能通过 detect 附加,1.19.50 起已弃用。
参数
/execute 由子命令驱动,各子命令的参数不同。以下是所有子命令中出现的公共参数。
<目标>— 目标选择器(如@p、@a、@e、@s),指定一个或多个实体作为操作对象,用于as、at、positioned as、rotated as、facing entity及if entity等子命令。<x> <y> <z>— 世界坐标,支持绝对坐标(数字)、相对坐标(~)和局部坐标(^);相对坐标基于当前执行位置计算,局部坐标基于当前朝向计算。<yaw> <pitch>— 水平旋转角与垂直旋转角,单位为度,yaw取值约 -180180,90,仅用于pitch取值约 -90rotated子命令。<维度>— 维度 ID 字符串,可选值见「维度 ID」表,用于in子命令。<方块>— 方块 ID(如stone、diamond_block、sand),用于if block和旧版detect。[数据值]— 方块的旧版数据值,整数 0-15,用于区分同一方块 ID 下的不同变体,现多被独立方块 ID 或方块状态取代。<轴>— 需要对齐的坐标轴,x、y、z的任意不重复组合(如xyz、xz),用于align子命令。<计分板目标>— 计分板目标名称(字符串,如money),用于if score子命令。<范围>— 整数范围,写法如3(恰好 3)、3..(≥3)、..5(≤5)、3..5(3~5 闭区间),用于if score ... matches。<运算符>— 分数比较运算符,可选值见「运算符」表,用于两个分数之间的if score比较。<命令>— 最终要执行的命令字符串,由run触发,必须放在整条命令末尾。
子命令一览
执行者与位置
| 子命令 | 作用 |
|---|---|
as <目标> | 改变执行者,让 @s 指代目标;不改位置、角度、维度 |
at <目标> | 把执行位置、角度、维度设为目标的对应值;不改执行者 |
positioned <x> <y> <z> | 直接把执行位置设为指定坐标 |
positioned as <目标> | 只把执行位置设为目标的位置,不改角度与维度 |
rotated <yaw> <pitch> | 直接把执行角度设为指定值 |
rotated as <目标> | 把执行角度设为目标的角度 |
facing <x> <y> <z> | 让执行角度朝向指定坐标 |
facing entity <目标> [eyes/feet] | 让执行角度朝向目标实体的眼睛或脚底 |
align <轴> | 把执行位置沿指定轴向下取整,对齐到方块网格 |
anchored eyes/feet | 设定锚点为眼睛或脚底,改变 ^ 局部坐标的起点 |
in <维度> | 把执行维度切换为指定维度 |
条件判断
| 子命令 | 作用 |
|---|---|
if entity <目标> | 指定实体存在时继续,替代旧版 /testfor |
if block <x> <y> <z> <方块> [数据值] | 指定位置为指定方块时继续,替代旧版 /testforblock |
if blocks <起点> <终点> <目标> [all/masked] | 两片区域方块匹配时继续,替代旧版 /testforblocks |
if score <目标> <计分板目标> matches <范围> | 分数落入指定范围时继续 |
if score <目标> <计分板目标> <运算符> <源目标> <源计分板目标> | 两个分数比较成立时继续 |
unless <条件> | 上述任意条件的取反,条件不成立时继续 |
if blocks 的 all 表示区域内所有方块(含空气)都必须匹配,masked 表示忽略空气方块、只比较非空气方块。if block 可附带数据值或方块状态,未指定时忽略方块状态(相当于 -1)。
结束
| 子命令 | 作用 |
|---|---|
run <命令> | 应用当前全部上下文后执行最终命令,放在链尾;可省略,省略时命令返回最后一个条件的判定结果 |
运算符
if score 比较两个分数时使用以下运算符:
| 运算符 | 含义 |
|---|---|
= | 等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
维度 ID
| 维度 | ID |
|---|---|
| 主世界 | overworld |
| 下界 | nether |
| 末地 | the_end |
用 in 切换维度时会按维度比例缩放坐标:从主世界进入下界乘以 0.125,从下界返回主世界乘以 8。
示例
在所有玩家脚下放置钻石块:
/execute as @a at @s run setblock ~ ~-1 ~ diamond_block
遍历每个在线玩家,先把执行者切换为该玩家(as @a),再把执行位置移到该玩家处(at @s),最后在其脚下 1 格放置钻石块。多目标选择器使命令为每个玩家各执行一次。
在最近玩家头顶召唤闪电:
/execute at @p run summon lightning_bolt ~ ~2 ~
把执行位置移到最近玩家处但保留原执行者,然后在其头顶 2 格处召唤一道闪电。这里没有用 as,因此 @s 不会改变。
杀死站在沙子上的僵尸:
/execute as @e[type=zombie] at @s if block ~ ~-1 ~ sand run kill @s
遍历所有僵尸,对每个僵尸检测其脚下方块是否为 sand,是则杀死该僵尸。if block 在这里起到过滤器作用,条件不成立的僵尸会被跳过。
给分数达标的玩家显示标题:
/execute as @a if score @s money matches 100.. run title @s title "达标"
遍历每个玩家,检查其 money 计分板目标上的分数是否 ≥100,是则给该玩家显示标题「达标」。需要先用 /scoreboard 创建 money 目标。
用两个分数比较刷新最高纪录:
/execute as @a if score @s points > @s record run scoreboard players operation @s record = @s points
遍历每个玩家,比较其 points 与 record 两个计分板目标的分数,若当前分超过纪录分,则把 record 更新为 points 的值。
半径 10 格内没有僵尸时提示安全:
/execute as @a at @s unless entity @e[type=zombie,r=10] run title @s actionbar "附近安全"
遍历每个玩家,检查其 10 格半径内是否存在僵尸,不存在时向该玩家显示动作栏「附近安全」。unless 表示条件不成立时才继续执行。
在末地召唤末影龙:
/execute in the_end run summon ender_dragon 0 64 0
把执行维度切换到末地,然后在坐标 (0, 64, 0) 处召唤末影龙。in 只改维度,不改执行者与执行位置。
让粒子朝向玩家视线发射:
/execute at @p facing entity @p eyes run particle minecraft:basic_flame_particle ^ ^ ^1
把执行位置移到最近玩家处,并让执行朝向对准该玩家眼睛,然后在其视线前方 1 格发射火焰粒子。facing entity 会根据目标眼睛位置重新计算执行朝向。
把玩家对齐到所在方块中心:
/execute as @a at @s align xz run tp @s ~0.5 ~ ~0.5
遍历每个玩家,先取得其位置,再把 x、z 坐标向下取整对齐到方块网格(align xz),最后传送到该方块的中心点。
基岩版注意
- 需要 OP 等级 2,这是基岩版中唯一需要等级 2 的命令。
- 基岩版 1.19.50 起才支持子命令链语法;此前旧版
execute <目标> <位置> [detect ...]语法已弃用,旧版detect是基岩版独有写法,Java 版从未有过。 - 与 Java 版相比,基岩版缺少
store、summon、on等子命令,无法把命令成功次数或结果写入计分板、方块数据或实体数据。 if/unless判定失败时,整条命令链(包括run)都不会执行,且命令会以失败返回,可被条件命令方块读取。- 用
in跨维度时坐标会按维度比例缩放:主世界进入下界乘以 0.125,下界返回主世界乘以 8。 anchored eyes在部分版本存在已知 bug,相对坐标也可能被抬高到眼睛高度,且一条命令中只能生效一次,多次书写不叠加。- 从命令方块执行时命令没有执行者,此时
@s选择不到任何目标,需要先用as指定执行者。
常见问题
为什么我的命令里 `@s` 选不到目标?
@s 指代「当前执行者」。从命令方块发出的命令没有执行者,而 at、positioned、in 等子命令只改位置或维度、不改执行者。你需要先用 as <目标> 设定执行者,@s 才会解析到对应的实体。
旧版 `detect` 和新版 `if block` 有什么区别?
旧版 detect 必须跟在 execute <目标> <位置> 之后,只能检测方块,是基岩版旧语法的独有写法。新版 if block 是独立的子命令,可以放在子命令链的任意位置,还能附带数据值或方块状态;两者都等价于「指定位置是否为指定方块」的判定,但 detect 已随旧语法在 1.19.50 弃用。
`as @e` 会让后面的命令执行很多次吗?
会。当 as、at、positioned as 等子命令的选择器匹配到多个实体时,命令流会按匹配数量分叉,每个实体各执行一次后续子命令和 run,@s 依次指代每个实体。这正是用一条命令批量处理多个目标的原理。
`if score` 的 `matches` 范围怎么填?
使用整数范围语法:3 表示恰好等于 3,3.. 表示大于等于 3,..5 表示小于等于 5,3..5 表示 3 到 5 的闭区间。两个分数之间比较则改用运算符形式,例如 if score @s a >= @s b。
`if block` 需要写数据值吗?
不需要。数据值参数可省略,省略时忽略方块状态(相当于 -1),只匹配方块 ID 本身。只有当你需要区分同一方块 ID 下的不同变体时才需要附加数据值或方块状态。