/execute
可以在改变执行者、执行位置和角度,添加限制条件,并储存其输出值的情况下执行另一条命令。
Java版[]
在Java版中,execute由多个子命令连接而成,共有12条子命令。子命令分为4类:修饰子命令、条件子命令、存储子命令和run
子命令。
- 修饰子命令修改命令变量并改变命令执行的方式,从而以特定的执行者、执行位置、执行维度和执行朝向执行后续子命令。
- 条件子命令用于检测特定条件是否成立,并输出结果或限制命令执行的条件。
- 存储子命令可以将命令返回值存储至记分板,boss栏,或NBT数据中。
run
子命令用于执行另一个命令。
/execute命令允许将任意子命令串连在一起。除run子命令外的子命令可以随意排列或重复使用多次,而run
子命令只能使用一次且只能位于命令最后位置。命令必须以条件子命令或run
子命令结尾,否则没有实际效果。对于多个子命令,游戏会按顺序从前向后依次处理,比如,以下命令是不同的:
- 所有的实体向各自所朝的方向移动一格:
execute as @e at @s run tp ^ ^ ^1
- 所有的实体移动到执行者的前方一格:
execute at @s as @e run tp ^ ^ ^1
游戏会在处理run
子命令和存储子命令之前,先处理其他子命令,故run
子命令和存储子命令无法影响其他子命令。run
子命令和存储子命令也无法相互影响。在某些情况下,命令会中止执行。
命令执行后如果没有中途停止,就会返回成功次数(success)和一个结果(result)(详见存储子命令),这两个数值都来自于结尾的条件子命令或run
子命令。注意命令的返回值必定为整数,若为小数会被向下取整。成功次数通常会是0或1。但如果此命令分开被执行多次(比如通过at @a
)那么其成功次数可以大于1。当命令没有执行成功时,两个返回值均为0。当结尾的条件子命令或run子命令被执行了多次时,只返回最后一次执行的值。这两个值可以被储存子命令储存。
使用命令方块执行命令时将把它们返回到该命令方块上,这可以用条件制约的命令方块检测是否成功,也可以使用红石比较器读取成功次数。
execute
命令有12个子命令,每一个都有其自身的语法。
/execute ...
... align <axes> -> execute
... anchored <anchor> -> execute
... as <targets> -> execute
... at <targets> -> execute
... facing (<pos>|entity <targets> <anchor>) -> execute
... in <dimension> -> execute
... positioned (<pos>|as <targets>) -> execute
... rotated (<rot>|as <targets>) -> execute
... store (result|success) ...
... block <targetPos> <path> <type> <scale> -> execute
... bossbar <id> (max|value) -> execute
... entity <target> <path> <type> <scale> -> execute
... score <targets> <objective> -> execute
... storage <target> <path> <type> <scale> -> execute
... (if|unless) ...
... block <pos> <block> -> [execute]
... blocks <start> <end> <destination> (all|masked) -> [execute]
... data ...
... block <sourcePos> <path> -> [execute]
... entity <source> <path> -> [execute]
... storage <source> <path> -> [execute]
... entity <entities> -> [execute]
... predicate <predicate> -> [execute]
... score <target> <targetObjective> ...
... (<|<=|=|>|>=) <source> <sourceObjective> -> [execute]
... matches <range> -> [execute]
... run <command>
其中的-> execute
代表另一个要执行的子命令的开始。
以下是对所有子命令的详细介绍。
修饰子命令[]
align[]
把执行位置转换为方块坐标(向下取整)。
- 语法
align <axes> -> execute
- 参数
<axes>
:swizzlex
、y
、z
中的不重复的任意组合。(例如x
、xz
、yz
和zyx
。)
- 效果
- 改变执行坐标。
- 参数不是字母
x
、y
、z
时视为语法错误。
- 示例
- x=-1.8, y=2.3, z=5.9时,<axes>为
x
将变为x=-2, y=2.3, z=5.9- 比如,
execute positioned -1.8 2.3 5.9 align x run tp ~ ~ ~
将把自己传送到(-2, 2.3, 5.9)
- 比如,
- x=2.4, y=-1.1, z=3.8时,<axes>为
xyz
将变为x=2, y=-2, z=3- 比如,
execute positioned 2.4 -1.1 3.8 align yxz run tp ~ ~ ~
将把自己传送到(2, -2, 3)
- 比如,
- 将自己的y坐标微调向下取整:
execute align y run tp ~ ~ ~
anchored[]
- 使用此命令切换命令的基准点为实体脚或眼睛的位置。默认为脚。(如在使用局部坐标或朝向时)
- 语法
anchored <anchor> -> execute
- 参数
<anchor>
:entity_anchor(eyes
或feet
)- 基准是眼睛的位置(
eyes
)或是脚的位置(feet
)。
- 基准是眼睛的位置(
- 效果
^ ^ ^
的定位被重新基准为眼睛或脚部。- 参数不正确时,视为语法错误。
- 示例
/tp
的效果是通过将脚部移动到指定的位置来移动实体。execute anchored eyes run tp ^ ^ ^
有效地将命令执行者的腿部移动到眼睛的位置(执行位置)。execute anchored eyes run tp ^5 ^ ^
意味着“将命令执行者的腿部移动到眼部位置5格左边的位置”。
as[]
- 改变命令的执行者(executor),但不改变执行位置或执行朝向等。
- 语法
as <targets> -> execute
- 效果
- 将执行者改为目标实体(改变
@s
的含义) - 参数不正确时,视为语法错误。
- 当目标实体不存在时命令终止执行。
- 当选择到多个实体时,以各个实体为执行者分别执行一次后续子命令。
- 示例
at[]
- 改变命令的执行位置、执行朝向和执行维度为指定实体的坐标、朝向和维度,不改变命令执行者。
- 语法
at <targets> -> execute
- 参数
<targets>
:entity- 指定目标实体,可以是玩家ID、UUID或目标选择器。
- 结果
- 位置、朝向和维度更新为目标实体的(影响
~ ~ ~
和^ ^ ^
的定位) - 参数不正确时,视为语法错误。
- 当目标实体不存在时命令终止执行。
- 如果选择多个实体,则以多个实体的执行位置、执行朝向和执行维度,分别执行一次后续子命令。
- 示例
- 在一名随机玩家头上放置一颗石头:
execute at @r run setblock ~ ~ ~ stone
- 所有的绵羊向上移动1格:
execute as @e[type=sheep] at @s run tp ~ ~1 ~
- 注意
execute at @e[type=sheep] run kill @s
会清除执行者而对绵羊没有影响,因为at子命令不修改执行者。
facing[]
- 将命令的执行朝向改为面向指定的坐标或某个实体,不改变命令执行者和执行位置。
- 语法
facing <pos> -> execute
facing entity <targets> <anchor> -> execute
<anchor>
:entity_anchor(eyes
或feet
)- 确定朝向实体眼睛(
eyes
)还是脚(feet
)的位置。
- 确定朝向实体眼睛(
- 效果
- 将朝向改为面向指定的坐标或目标实体
- 参数不正确时,视为语法错误
- 当目标实体不存在时命令终止执行。
- 当选择到多个实体时,则以多个执行朝向分别执行一次后续子命令。
- 示例
- 所有的实体都朝着(0, 64, 0)的方向移动一格(不改变自身的朝向):
execute as @e at @s facing 0 64 0 run tp ^ ^ ^1
- 所有非玩家实体朝着各自距离最近的玩家的方向移动一格(不改变自身的朝向):
execute as @e[type=!player] at @s facing entity @p feet run tp ^ ^ ^1
in[]
- 将命令执行维度设为特定维度。命令将在指定的维度中执行。
- 语法
in <dimension> -> execute
- 效果
- 更新执行维度。
- 参数不正确时,视为语法错误。
- 示例
- 在下界的世界中心(0,0,0)放置一块泥土:
execute in minecraft:the_nether run setblock 0 0 0 dirt
- 寻找末地中的末地城:
execute in the_end run locate endcity
- 注意不同的维度有不同的坐标尺度:从主世界传送到下界时,执行位置(仅X/Z轴部分)会除以8,从下界传送到主世界则会乘以8。同样适用于自定义维度。如:
- 主世界(16,64,16)位置的玩家运行
execute in minecraft:the_nether positioned as @s run tp ~ ~ ~
,会传送到下界的(16,64,16)。 - 主世界(16,64,16)位置的玩家运行
execute in minecraft:the_nether run tp ~ ~ ~
,会传送到下界的(2,64,2)。 - 主世界(80,64,80)位置的玩家运行
execute in minecraft:the_nether run tp ~ ~ ~5
,会传送到下界的(10,64,15)。
- 主世界(16,64,16)位置的玩家运行
positioned[]
在指定的坐标执行命令。改变执行位置,但不改变执行者、执行朝向。
- 语法
positioned <pos> -> execute
positioned as <targets> -> execute
- 效果
- 改变命令的执行位置。
- 参数不正确时,视为语法错误。
- 当目标实体不存在时命令终止执行。
- 如果选择多个实体,则以各个执行位置,分别执行一次后续子命令。
- 示例
- 给予离坐标(7,-90,7)最近的玩家一颗钻石:
execute positioned 7 -90 7 run give @p diamond
- 假设执行者处于主世界时,寻找(0, 64, 0)附近的村庄:
execute positioned 0 64 0 run locate Village
- 假设执行者处于其他维度时,寻找主世界(0, 64, 0)附近的村庄:
execute in overworld positioned 0 64 0 run locate Village
- 让所有的绵羊向着玩家(执行者)的朝向移动一格(比如,玩家看着东边时,绵羊向东移动一格;玩家看着上方时,绵羊向上移动一格):
execute as @e[type=sheep] positioned as @s rotated as @p run tp @s ^ ^ ^1
rotated[]
- 将命令的执行朝向设为特定方向,或者设为指定实体的朝向。改变执行朝向,不改变执行者和执行位置。
- 语法
rotated <rot> -> execute
rotated as <targets> -> execute
- 效果
- 参数不正确时,视为语法错误。
- 当
<targets>
实体不存在时命令终止执行。 - 如果选择多个实体,则以各个执行朝向,分别执行一次后续子命令。
- 示例
- 让所有的绵羊以各自距离最近玩家的朝向作为方向移动1格:
execute as @e[type=sheep] at @s rotated as @p run tp @s ^ ^ ^1
条件子命令[]
条件子命令if
和unless
用于限制命令只有在指定的条件下执行。if
为如果......就,而unless
为除非......否则。 除此之外两者都有相同的参数结构。
如果在不使用存储子命令和run子命令的情况下单独执行条件子命令,execute命令将会报告是否匹配成功作为命令的成功次数,成功匹配的数量作为返回值。
有6种不同类型的条件:
- (if|unless) block – 检测单个具体方块
- (if|unless) blocks – 检测两个长方体区域内的方块匹配情况
- (if|unless) data – 检测方块、实体或存储持有的数据
- (if|unless) entity – 检测指定实体是否存在
- (if|unless) predicate – 指定谓词是否通过
- (if|unless) score - 检测目标的分数
(if|unless) block[]
- 比较给定的位置的方块是否为给定的方块ID
- 语法
(if|unless) block <pos> <block> -> [execute]
(if|unless) blocks[]
- 比较相同大小的两个长方体区域的方块
- 语法
(if|unless) blocks <start> <end> <destination> <scan mode> -> [execute]
(if|unless) data[]
- 检查目标方块、实体或存储NBT是否拥有给定的NBT标签。
- 语法
(if|unless) data block <pos> <path> -> [execute]
——用于检查方块(if|unless) data entity <target> <path> -> [execute]
——用于检查实体(if|unless) data storage <source> <path> -> [execute]
——用于检查存储NBT
- 参数
<pos>
:block_pos- 要被检测的方块的坐标
<target>
:entity- 要被检测的单个实体
<source>
:resource_location- 要被检测的存储NBT的命名空间ID
<path>
:nbt_path- 要检查的NBT标签。
(if|unless) entity[]
- 检查一个或多个特定实体是否存在。
(if|unless) predicate[]
- 检查谓词(predicate)是否通过(结果是否为正)。见谓词。
- 语法
(if|unless) predicate <predicate> -> [execute]
- 参数
<predicate>
:resource_location
(if|unless) score[]
检查指定目标的记分板中的记分项的分数是否与另一个(或同一个)目标的记分项的分数是否符合指定的关系,或者是否在给定的范围之内。
- 语法
(if|unless) score <target> <targetObjective> (<|<=|=|>=|>) <source> <sourceObjective> -> [execute]
- ——检查
<target>
的<targetObjective>
的分数与<source>
的<sourceObjective>
的分数是否符合运算符的关系。
- ——检查
(if|unless) score <target> <targetObjective> matches <range> -> [execute]
- ——检查
<target>
的<targetObjective>
的分数是否在指定<range>
内。
- ——检查
- 参数
<target>
:score_holder<targetObjective>
:objective- 检查的记分项。
- 选项:
(<|<=|=|>=|>) <source> <sourceObjective>
<source>
:score_holder<sourceObjective>
:objective- 记分项。
- 选项:
matches <range>
<range>
:int_range- 检查分数是否在某个范围之内。可以使用
数字..数字
来指定范围。缺省一侧可指定大于等于或小于等于。
- 检查分数是否在某个范围之内。可以使用
效果[]
- 当处于execute命令结尾时:对于
if
,如果条件成立则命令成功,否则失败。对于unless
,如果条件不成立则命令成功,否则失败。 - 当位于execute命令中间时:对于
if
,如果条件成立继续执行后续子命令,否则终止执行。对于unless
,如果条件不成立则继续执行后续子命令,否则终止执行。
示例[]
- 击杀所有踩在羊毛上的玩家:
execute as @a at @s if block ~ ~-1 ~ #wool run kill @s
- 若世界中有绵羊就执行函数foo:bar:
execute if entity @e[type=sheep] run function foo:bar
- 检测自己的a分数与b分数是否相等:
execute if score @s a = @s b
- 击杀所有在3格范围内没有豹猫的苦力怕:
execute as @e[type=creeper] at @s unless entity @e[type=ocelot,distance=..3] run kill @s
- 给予所有拥有附魔物品的玩家一块石头:
execute as @a if data entity @s Inventory[{}].tag.Enchantments run give @s stone
存储子命令[]
存储子命令可以让命令在执行之后将命令返回的结果或成功次数储存于记分板、NBT数据、或boss栏中,有store result
和store success
两种模式。注意命令的返回值必定为整数,若为小数会被向下取整。每种命令的返回值情况在对应的页面有表格或文字记载。
有五种不同的存储模式:
- store (result|success) block——存储在方块NBT中
- store (result|success) bossbar——存储在boss栏的数据中
- store (result|success) entity——存储在一个实体的NBT中
- store (result|success) score——存储在目标的记分项的分数中
- store (result|success) storage——存储在储存的NBT中
store (result|success) block[]
- 将命令的返回值存储为方块实体内的标签数据。可存储为字节、短整型、整型、长整型、浮点或双精度浮点的格式。如果返回值为小数,会先向下取整然后乘以一定的
<scale>
。
- 语法
store (result|success) block <targetPos> <path> <type> <scale> -> execute
- 结果
- 参数不正确时,视为语法错误。
- 路径不存在时不进行操作。
- 执行成功时,将返回值或成功次数乘以
<scale>
后储存在<targetPos>
处方块实体的NBT标签的<path>
处,并储存为指定的NBT格式。
store (result|success) bossbar[]
- 将命令的返回值存储为boss栏的当前值或者最大值。
- 语法
store (result|success) bossbar <id> (value|max) -> execute
- 参数
<id>
:resource_location- 需要储存在的boss栏的命名空间ID
(value|max)
- 存储为boss栏的当前值(value)还是最大值(max)
- 结果
- 参数不正确时,视为语法错误。
- 执行成功时,将id为
<id>
的boss栏的当前值或最大值修改为命令的返回值或成功次数。
store (result|success) entity[]
- 将返回值或成功次数乘以
<scale>
后储存在<target>
的NBT标签的<path>
中,并储存为指定的NBT格式。若返回值为小数,则先向下取整再乘以<scale>
。与/data
一样,不能修改玩家的NBT。
- 结果
- 参数不正确时,视为语法错误。
- 路径不存在时不进行操作。
- 执行成功时,将返回值或成功次数乘以
<scale>
后储存在<target>
实体的NBT标签的<path>
处,并储存为指定的NBT格式。
store (result|success) score[]
- 将给定的
<objective>
中<targets>
持有的分数修改为命令的返回值或成功次数。
- 语法
store (result|success) score <targets> <objective> -> execute
- 参数
<targets>
:score_holder- 修改此分数持有者(可以是实体、选择器甚至不存在的玩家)的分数
<objective>
:objective- 记分项。
- 结果
- 参数不正确时,视为语法错误。
- 执行成功时,返回值或成功次数会被储存为
<target>
的<objective>
分数。
store (result|success) storage[]
- 使用储存中的
<path>
以将返回值或成功次数存储为指定的数据类型。如果返回的值是小数,则先取整再乘以一定的<scale>
。如果存储不存在,则会创建。
- 语法
store (result|success) storage <target> <path> <type> <scale> -> execute
- 参数
<target>
:resource_location- 目标存储容器的命名空间ID。
<path>
:nbt_path- 需要持有结果的NBT标签的位置。
<type>
:只能是byte|short|int|long|float|double
- 需要存储为的数据的类型。
<scale>
:double- 存储值前先乘以一定的倍率。
- 结果
- 参数不正确时,视为语法错误。
run子命令[]
要被执行的命令。
- 语法
run <command>
- 参数
<command>
- 任何一个完整的命令,不可以以斜线开头。
- 技术细节
- 将命令节点重置为command dispatcher的根节点。
- 注意:
- command dispatcher是在玩家开始一个带有斜杠
/
的消息时开始的。 - 命令节点是光标正在编辑的特定词(word)或项(entry),是一个命令或参数。
- 根节点在当前命令的第一个词之前出现。
- command dispatcher是在玩家开始一个带有斜杠
- 结果
- 执行这个命令。指定的命令执行成功时成功,失败时失败。
更多示例[]
- 将所有快捷栏第一槽位物品带有效率魔咒的玩家传送到0, 64, 0:
execute as @a if data entity @s Inventory[{Slot:0b}].tag.Enchantments[{id:"minecraft:efficiency"}] run tp @s 0 64 0
- 在所有玩家眼睛前方三格召唤烟雾粒子效果:
execute as @a at @s anchored eyes run particle smoke ^ ^ ^3
- 将所有在5米以内有玩家的猪上鞍:
execute as @e[type=pig] at @s if entity @p[distance=..5] run data merge entity @s {Saddle:1b}
- 让所有在水中的玩家在聊天框里说:“我的脚湿了!”:
execute as @a at @s if block ~ ~ ~ water run say 我的脚湿了!
- 让所有“test”记分板未设置的玩家在聊天框里说:“分数已重置”:
execute as @a unless score @s test = @s test run say 分数已重置
- 将所有玩家的可损坏物品数量存到其在
ItemsWithDamage
上的分数:execute as @a store result score @s ItemsWithDamage run execute if data entity @s Inventory[].tag.Damage
基岩版[]
语法[]
execute <origin: target> <position: x y z> <command: command>
- 可以限制在指定方块被检测到时才执行命令:
execute <origin: target> <position: x y z> detect <detectPos: x y z> <block: Block> <data: int> <command: command>
参数[]
origin: target
- 指定目标命令执行者。必须为一个玩家名或目标选择器。若多个目标被选中,则每个目标各运行一次指定的命令。
position: x y z
- 指定命令运行的位置。x和z必须在-30,000,000到30,000,000内(含)。使用波浪号指定的相对坐标的参考点为命令代行者所处位置,而非此命令的执行位置。
command: command
- 指定要运行的命令。必须为一个有效命令。
detectPos: x y z
- 指定要检测方块的位置。x和z必须在-30,000,000到30,000,000内(含)。可使用波浪号来指定与
position: x y z
的相对坐标。
- 指定要检测方块的位置。x和z必须在-30,000,000到30,000,000内(含)。可使用波浪号来指定与
block: Block
(仅在detect
模式可用)- 指定方块ID,必须与
detectPos: x y z
处的方块相同,命令才会执行。block: Block
必须是有效的方块ID或方块名(例如,minecraft:stone
)。
- 指定方块ID,必须与
data: int
(仅在detect
模式可用)- 必须与测试方块的方块数据相等,命令才会执行。设为
-1
可匹配任意的方块数据。
- 必须与测试方块的方块数据相等,命令才会执行。设为
效果[]
- 若参数指定不正确,或
origin: target
无法解析为一个或多个有效实体(指定名字的玩家必须在线),或检测到的方块ID、数据或状态不匹配,或指定的命令执行失败则失败。
- 若成功,指定的命令将在指定的坐标位置,使用管理员等级的权限,以目标的身份执行。
- 具体操作流程:
origin
- 把将要运行的命令的执行者、执行位置、执行朝向、执行维度改为目标实体、目标实体的位置、朝向、维度。
position
- 修饰将要运行的命令的执行位置。
detectPos
block
data
- 根据将要运行的命令的执行位置、执行朝向,和execute命令的执行维度检测指定位置的方块是否为给定方块ID及数据。
command
- 若使用第一种语法或检测到的方块符合条件,则执行将要运行的命令。
示例[]
- 在所有僵尸的位置上召唤闪电:
/execute @e[type=zombie] ~ ~ ~ summon lightning_bolt
- 在所有站在任意种类沙子的僵尸的位置上召唤闪电:
/execute @e[type=zombie] ~ ~ ~ detect ~ ~-1 ~ minecraft:sand -1 summon lightning_bolt
- 通过嵌套检测最近的僵尸是否站在任意种类沙子,如果是则在这只僵尸的位置上召唤闪电:
/execute @e[type=zombie,c=1] ~ ~ ~ execute @s ~ ~ ~ detect ~ ~-1 ~ minecraft:sand -1 summon lightning_bolt
- 让最近10个实体在其最近一位玩家的位置上召唤一只苦力怕:
/execute @e[c=10] ~ ~ ~ execute @p ~ ~ ~ summon creeper ~ ~ ~
- 在你朋友的位置上召唤末影龙:
/execute <朋友的名字> ~ ~ ~ summon ender_dragon
历史[]
Java版 | |||||
---|---|---|---|---|---|
1.8 | 14w07a | 加入了/execute 命令。 | |||
14w08a | 在命令方块中运行的run命令现在会把成功值返回值传回命令方块了。 | ||||
1.11 | 16w32a | 加入了方块状态支持。 | |||
1.13 | 17w45a | 语法被拆分。 | |||
17w45b | 重制了/execute store 命令。 | ||||
18w02a | 加入了新的子命令以允许通过命令进行更多的控制。 | ||||
18w05a | 加入了/execute store 子命令。 | ||||
1.14 | 18w43a | 加入了/execute (if|unless) data 。 | |||
1.15 | 19w38a | 加入了/execute if predicate 。
| |||
加入了/execute store storage 。 | |||||
携带版Alpha | |||||
0.16.0 | build 1 | 加入了/execute 。
| |||
此命令的功能相当于其在Java版1.10的功能,但在/execute 中实体目标是可选的。 | |||||
基岩版(即将到来) | |||||
1.19.10 | 1.19.10.20 | 加入了一些新的子命令,属于实验性玩法。 |
视频[]
你知道吗[]
- 基岩版中的
/execute <origin: target> <position: x y z> detect <detectPos: x y z> <block: Block> <data: int> <command: command>
命令
- 与Java版中的
/execute as <targets: entity> rotated as @s positioned as @s positioned <pos: vec3> if block <pos: block_pos> <block: block_predicate> at @s positioned <pos: vec3>[注 1] run <command>
命令有几乎完全相同的效果。[需要验证] - 如不考虑跨维度问题,则Java版可写成
/execute as <targets: entity> at @s positioned <pos: vec3> if block <pos: block_pos> <block: block_predicate> run <command>
。
- ↑ 与前者的参数相同。