| name | fabric-cli-powerbi |
| description | Use Fabric CLI for Power BI operations — semantic models, reports, DAX queries, refresh, gateways. Activate when users work with Power BI items, need to refresh datasets, execute DAX, manage reports, or troubleshoot refresh failures. |
Fabric CLI Power BI Operations
Expert guidance for working with Power BI items (semantic models, reports, dashboards) using the fab CLI.
When to Use This Skill
Activate automatically when tasks involve:
- Semantic model (dataset) operations — get, export, refresh, update
- Report management — export, clone, rebind to different model
- Executing DAX queries against semantic models
- Managing refresh schedules and troubleshooting failures
- Gateway and data source configuration
- TMDL (Tabular Model Definition Language) operations
Prerequisites
- Load
fabric-cli-core skill first for foundational CLI guidance
- User must be authenticated:
fab auth status
- Appropriate workspace permissions for target items
Automation Scripts
Ready-to-use Python scripts for Power BI tasks. Run any script with --help for full options.
| Script | Purpose | Usage |
|---|
refresh_model.py | Trigger and monitor semantic model refresh | python scripts/refresh_model.py <model> [--wait] [--timeout 300] |
list_refresh_history.py | Show refresh history and failure details | python scripts/list_refresh_history.py <model> [--last N] |
rebind_report.py | Rebind report to different semantic model | python scripts/rebind_report.py <report> --model <new-model> |
Scripts are located in the scripts/ folder of this skill.
1 - Power BI Item Types
| Entity Suffix | Type | Description |
|---|
.SemanticModel | Semantic Model | Power BI dataset (tabular model) |
.Report | Report | Power BI report (visualizations) |
.Dashboard | Dashboard | Power BI dashboard (pinned tiles) |
.Dataflow | Dataflow | Power Query dataflow |
.PaginatedReport | Paginated Report | RDL-based paginated report |
Path Examples
# Semantic model
Production.Workspace/Sales.SemanticModel
# Report connected to model
Production.Workspace/SalesReport.Report
# Dashboard
Production.Workspace/ExecutiveDash.Dashboard
2 - Semantic Model Operations
Get Model Information
fab exists "ws.Workspace/Model.SemanticModel"
fab get "ws.Workspace/Model.SemanticModel"
fab get "ws.Workspace/Model.SemanticModel" -q "id"
fab get "ws.Workspace/Model.SemanticModel" -q "definition"
Export Model
fab export "ws.Workspace/Model.SemanticModel" -o ./exports -f
Creates folder structure:
Model.SemanticModel/
├── .platform
├── definition.pbism
└── definition/
├── model.tmdl
├── tables/
│ ├── Sales.tmdl
│ └── Date.tmdl
└── relationships.tmdl
Import/Update Model
fab import "ws.Workspace/Model.SemanticModel" -i ./exports/Model.SemanticModel -f
fab cp "Dev.Workspace/Model.SemanticModel" "Prod.Workspace/Model.SemanticModel" -f
3 - Refresh Operations
Trigger Refresh
WS_ID=$(fab get "ws.Workspace" -q "id" | tr -d '"')
MODEL_ID=$(fab get "ws.Workspace/Model.SemanticModel" -q "id" | tr -d '"')
fab api -A powerbi "groups/$WS_ID/datasets/$MODEL_ID/refreshes" -X post -i '{"type":"Full"}'
fab api -A powerbi "groups/$WS_ID/datasets/$MODEL_ID/refreshes?\$top=1"
Enhanced Refresh (Partition-Level)
fab api -A powerbi "groups/$WS_ID/datasets/$MODEL_ID/refreshes" -X post -i '{
"type": "Full",
"commitMode": "transactional",
"objects": [
{"table": "Sales"},
{"table": "Inventory"}
]
}'
fab api -A powerbi "groups/$WS_ID/datasets/$MODEL_ID/refreshes" -X post -i '{
"type": "Full",
"retryCount": 3
}'
Refresh Schedule
fab api -A powerbi "datasets/$MODEL_ID/refreshSchedule"
fab api -A powerbi "datasets/$MODEL_ID/refreshSchedule" -X patch -i '{
"enabled": true,
"days": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"times": ["06:00"],
"localTimeZoneId": "UTC"
}'
Troubleshoot Refresh Failures
fab api -A powerbi "groups/$WS_ID/datasets/$MODEL_ID/refreshes"
4 - DAX Query Execution
Execute DAX queries against semantic models:
MODEL_ID=$(fab get "ws.Workspace/Model.SemanticModel" -q "id" | tr -d '"')
fab api -A powerbi "datasets/$MODEL_ID/executeQueries" -X post -i '{
"queries": [{"query": "EVALUATE VALUES(Date[Year])"}]
}'
fab api -A powerbi "datasets/$MODEL_ID/executeQueries" -X post -i '{
"queries": [{
"query": "EVALUATE SUMMARIZECOLUMNS(Date[Year], \"Total\", SUM(Sales[Amount]))"
}]
}'
fab api -A powerbi "datasets/$MODEL_ID/executeQueries" -X post -i '{
"queries": [{
"query": "EVALUATE TOPN(10, Product, [Total Sales], DESC)"
}]
}'
fab api -A powerbi "datasets/$MODEL_ID/executeQueries" -X post -i '{
"queries": [{
"query": "EVALUATE FILTER(Sales, Sales[Year] = @Year)",
"parameters": [{"name": "@Year", "value": "2024"}]
}]
}'
5 - Report Operations
Get Report Info
fab exists "ws.Workspace/Report.Report"
fab get "ws.Workspace/Report.Report"
fab get "ws.Workspace/Report.Report" -q "definition.parts[?contains(path, 'definition.pbir')].payload | [0]"
Export Report
fab export "ws.Workspace/Report.Report" -o ./exports -f
Clone Report
fab cp "ws.Workspace/Report.Report" "ws.Workspace/ReportCopy.Report" -f
fab cp "Dev.Workspace/Report.Report" "Prod.Workspace/Report.Report" -f
Rebind Report to Different Model
WS_ID=$(fab get "ws.Workspace" -q "id" | tr -d '"')
REPORT_ID=$(fab get "ws.Workspace/Report.Report" -q "id" | tr -d '"')
NEW_MODEL_ID=$(fab get "ws.Workspace/NewModel.SemanticModel" -q "id" | tr -d '"')
fab api -A powerbi "groups/$WS_ID/reports/$REPORT_ID/Rebind" -X post -i "{
\"datasetId\": \"$NEW_MODEL_ID\"
}"
Export Report to File (PDF/PPTX)
fab api -A powerbi "groups/$WS_ID/reports/$REPORT_ID/ExportTo" -X post -i '{
"format": "PDF"
}'
6 - Gateway Operations
List Gateways
fab ls .gateways
fab get ".gateways/MyGateway.Gateway"
Data Source Management
GATEWAY_ID=$(fab get ".gateways/MyGateway.Gateway" -q "id" | tr -d '"')
fab api -A powerbi "gateways/$GATEWAY_ID/datasources"
fab api -A powerbi "gateways/$GATEWAY_ID/datasources/$DATASOURCE_ID"
Update Data Source Credentials
fab api -A powerbi "gateways/$GATEWAY_ID/datasources/$DATASOURCE_ID" -X patch -i '{
"credentialDetails": {
"credentialType": "Basic",
"credentials": "{\"credentialData\":[{\"name\":\"username\",\"value\":\"user\"},{\"name\":\"password\",\"value\":\"pass\"}]}",
"encryptedConnection": "Encrypted",
"encryptionAlgorithm": "None",
"privacyLevel": "Organizational"
}
}'
7 - Take Over Ownership
When a semantic model owner leaves the organization:
WS_ID=$(fab get "ws.Workspace" -q "id" | tr -d '"')
MODEL_ID=$(fab get "ws.Workspace/Model.SemanticModel" -q "id" | tr -d '"')
fab api -A powerbi "groups/$WS_ID/datasets/$MODEL_ID/Default.TakeOver" -X post
8 - Common Patterns
Dev to Production Deployment
#!/bin/bash
DEV_WS="Dev.Workspace"
PROD_WS="Prod.Workspace"
fab export "$DEV_WS/Sales.SemanticModel" -o ./deploy -f
fab export "$DEV_WS/SalesReport.Report" -o ./deploy -f
fab import "$PROD_WS/Sales.SemanticModel" -i ./deploy/Sales.SemanticModel -f
fab import "$PROD_WS/SalesReport.Report" -i ./deploy/SalesReport.Report -f
PROD_WS_ID=$(fab get "$PROD_WS" -q "id" | tr -d '"')
MODEL_ID=$(fab get "$PROD_WS/Sales.SemanticModel" -q "id" | tr -d '"')
fab api -A powerbi "groups/$PROD_WS_ID/datasets/$MODEL_ID/refreshes" -X post -i '{"type":"Full"}'
fab api -A powerbi "groups/$PROD_WS_ID/datasets/$MODEL_ID/refreshes?\$top=1" -q "value[0].status"
Backup Semantic Model
fab export "Prod.Workspace/Model.SemanticModel" -o ./backups/$(date +%Y%m%d) -f
git add ./backups/
git commit -m "Backup Model $(date +%Y-%m-%d)"
Incremental Refresh Setup
For large models, use incremental refresh:
- Configure in Power BI Desktop with RangeStart/RangeEnd parameters
- Publish to workspace
- First refresh creates partitions:
fab api -A powerbi "groups/$WS_ID/datasets/$MODEL_ID/refreshes?\$top=5"
9 - Safety Guidelines
- Always verify workspace context before refresh operations
- Test in dev first — never refresh production without testing
- Monitor refresh duration — set appropriate timeouts
- Backup before major changes — export definition before updates
- Use enhanced refresh for large models to avoid timeouts
10 - References
For detailed patterns, see: