SF
STS Forge

Batch Operations

Chain multiple Blueprint operations in a single engine startup with batch mode.

Full verb reference: AI Guide

Each commandlet invocation costs 10-30 seconds of engine startup. Batching all operations into a single invocation eliminates that overhead.

Basic Structure#

{
    "defaultAsset": "/Game/Blueprints/BP_Enemy",
    "operations": [
        {"verb": "add-var", "name": "Speed", "type": "Float"},
        {"verb": "set-var-default", "name": "Speed", "value": "600.0"},
        {"verb": "compile"},
        {"verb": "save"}
    ]
}

Running a Batch#

-verb=batch -input=C:/path/to/operations.json

Or pipe from stdin: -verb=batch -input=-

Result Referencing ($N)#

Operations can reference results from earlier operations using $N (1-indexed):

{
    "defaultAsset": "/Game/BP/BP_Player",
    "operations": [
        {"verb": "add-node", "type": "CustomEvent", "eventName": "OnDamaged", "posX": 0, "posY": 0},
        {"verb": "add-node", "type": "CallFunction", "function": "PrintString", "class": "KismetSystemLibrary", "posX": 300, "posY": 0},
        {"verb": "connect", "srcNode": "$1", "srcPin": "then", "dstNode": "$2", "dstPin": "execute"},
        {"verb": "compile"},
        {"verb": "save"}
    ]
}

What $N resolves to depends on the verb:

Verb $N resolves to
add-node Node GUID
add-var Variable name
add-function Function name
add-component Component name
add-event-dispatcher Dispatcher name
create Asset path
duplicate-asset New asset path
dt-add-row Row name
bb-add-key Key name
Others Stringified result summary

Comments in Batch Files#

Objects without a verb field are treated as comments. They are skipped but preserve $N indexing:

{"_comment": "This is step 1"},
{"verb": "add-var", "name": "Health", "type": "Float"}

The add-var above is still $2 (the comment was $1).

Error Handling#

  • Failed operations log an error in the results but don't stop the batch
  • The batch result shows succeeded and failed counts
  • Check results[N].success for each operation

Multi-Asset Batches#

Override the default asset per operation:

{
    "operations": [
        {"verb": "export", "asset": "/Game/BP/BP_Player", "--format": "summary"},
        {"verb": "export", "asset": "/Game/BP/BP_Enemy", "--format": "summary"},
        {"verb": "export", "asset": "/Game/BP/BP_Pickup", "--format": "summary"}
    ]
}

Common Batch Patterns#

For complete examples of these patterns, see Example Workflows.

Add Variables with Metadata#

{"verb": "add-var", "name": "Health", "type": "Float"},
{"verb": "set-var-default", "name": "Health", "value": "100.0"},
{"verb": "set-var-flags", "name": "Health", "flags": "EditAnywhere,BlueprintReadWrite,Replicated", "category": "Stats", "repNotify": "OnRep_Health"},
{"verb": "set-var-meta", "name": "Health", "clampMin": "0", "clampMax": "999", "tooltip": "Current health points"}

Create a Complete Function#

{"verb": "add-function", "name": "CalculateDamage", "isPure": true},
{"verb": "add-function-param", "function": "CalculateDamage", "name": "BaseDamage", "type": "Float", "direction": "input"},
{"verb": "add-function-param", "function": "CalculateDamage", "name": "Result", "type": "Float", "direction": "output"}

Audit CDO Properties Across Multiple Blueprints#

{
    "operations": [
        {"verb": "read-cdo", "asset": "/Game/Characters/BP_Player"},
        {"verb": "read-cdo", "asset": "/Game/Characters/BP_Enemy"},
        {"verb": "read-cdo", "asset": "/Game/Characters/BP_Boss"}
    ]
}

Manipulate Array Elements#

{"verb": "array-count", "asset": "/Game/GAS/GE_Damage", "property": "Modifiers"},
{"verb": "array-add", "asset": "/Game/GAS/GE_Damage", "property": "Modifiers"},
{"verb": "array-set", "asset": "/Game/GAS/GE_Damage", "property": "Modifiers", "index": "0", "value": "(Attribute=...)"},
{"verb": "array-get", "asset": "/Game/GAS/GE_Damage", "property": "Modifiers", "all": "true"},
{"verb": "save", "asset": "/Game/GAS/GE_Damage"}

Set Up a Blueprint from Scratch#

{"verb": "create", "asset": "/Game/Blueprints/BP_Pickup", "parent": "Actor"},
{"verb": "add-component", "asset": "$1", "name": "Root", "class": "SceneComponent"},
{"verb": "add-component", "asset": "$1", "name": "Mesh", "class": "StaticMeshComponent", "parent": "Root"},
{"verb": "add-component", "asset": "$1", "name": "Trigger", "class": "SphereComponent", "parent": "Root"},
{"verb": "add-var", "asset": "$1", "name": "PickupValue", "type": "Int"},
{"verb": "set-var-default", "asset": "$1", "name": "PickupValue", "value": "10"},
{"verb": "compile", "asset": "$1"},
{"verb": "save", "asset": "$1"}