bx-ini

Installation
SKILL.md

bx-ini: INI File Handling

Installation

install-bx-module bx-ini
# CommandBox
box install bx-ini

BIFs

BIF Description
getIniFile( file ) Open (or create) an INI file, returns an IniFile object
getProfileString( iniFile, section, entry ) Get a single entry value
setProfileString( iniFile, section, entry, value ) Set a single entry value
getProfileSection( iniFile, section ) Get an entire section as a struct
getProfileSections( iniFile ) Get all sections as a struct of structs
removeProfileSection( iniFile, section ) Remove an entire section
removeProfileString( iniFile, section, entry ) Remove a single entry

Reading an INI File

# /app/config/app.ini
[General]
appName=MyApplication
version=1.2.3
debug=false

[Database]
host=localhost
port=5432
dbname=myapp

[Logging]
logLevel=DEBUG
logFile=/var/log/myapp.log
// Read individual values
appName = getProfileString( "/app/config/app.ini", "General", "appName" )
host    = getProfileString( "/app/config/app.ini", "Database", "host" )
port    = getProfileString( "/app/config/app.ini", "Database", "port" )

// If entry doesn't exist, returns empty string
missingValue = getProfileString( "/app/config/app.ini", "General", "nonExistent" )
// Returns ""

// Read entire section as a struct
dbConfig = getProfileSection( "/app/config/app.ini", "Database" )
// { host: "localhost", port: "5432", dbname: "myapp" }

// Read all sections
allConfig = getProfileSections( "/app/config/app.ini" )
// { General: {...}, Database: {...}, Logging: {...} }

Writing an INI File

// Write a single value (creates section + key if not present)
setProfileString( "/app/config/app.ini", "General", "debug", "true" )

// Create a new section and populate it
setProfileString( "/app/config/app.ini", "Cache", "enabled", "true" )
setProfileString( "/app/config/app.ini", "Cache", "ttl", "300" )
setProfileString( "/app/config/app.ini", "Cache", "provider", "redis" )

Fluent IniFile Object API

// Get the IniFile object for fluent chaining
var ini = getIniFile( "/app/config/settings.ini" )

// Create a section
ini.createSection( "MySettings" )

// Set entries
ini.setEntry( "MySettings", "timeout", "30" )
ini.setEntry( "MySettings", "retries", "3" )
ini.setEntry( "MySettings", "endpoint", "https://api.example.com" )

// Read entries
timeout = ini.getEntry( "MySettings", "timeout" )

// Remove a single entry
ini.removeEntry( "MySettings", "retries" )

// Remove an entire section
ini.removeSection( "OldSettings" )

Config File Pattern

// Load per-environment config
env    = server.system.environment.APP_ENV ?: "development"
config = getProfileSections( "/app/config/#env#.ini" )

// Access config
println( config.Database.host )
println( config.General.appName )

Common Pitfalls

  • ✅ All values returned from INI files are strings — convert to numeric/boolean as needed: val( port )
  • ❌ INI files do not support nested sections — use YAML (bx-yaml) for hierarchical config
  • getIniFile() creates the file if it doesn't exist — safe for first-time setup
  • getProfileString() returns an empty string for missing entries — always check if empty when the value is required
Related skills

More from ortus-boxlang/skills

Installs
1
First Seen
Apr 15, 2026