Important
La CLI de Tabular Editor se encuentra en vista previa pública limitada. Se ofrece para su evaluación con una cuenta de Tabular Editor; no se requiere ninguna licencia durante la vista previa. Los comandos, las opciones y las salidas pueden cambiar antes de la disponibilidad general. La compilación de vista previa dejará de funcionar a partir del 2026-10-31. No recomendamos usar la CLI en pipelines de CI/CD de producción durante la vista previa.
Esta página recopila los casos en los que la CLI de Tabular Editor (te) se comporta de forma distinta a Tabular Editor 2 y 3, junto con lo que todavía no puede hacer, para que puedas planificar en consecuencia y evitar errores habituales. Se actualiza con cada versión; si encuentras un problema que no figura aquí, abre una incidencia en el repositorio público TabularEditor/CLI.
Note
Las entradas se agrupan por área. Cada entrada describe la diferencia o restricción y, cuando existe, una solución alternativa o la opción recomendada compatible con la CLI.
Scripts
La CLI ejecuta C# Scripts (te script) sobre el mismo objeto Model que usas en Tabular Editor 2 y 3, pero funciona como un host de consola sin interfaz gráfica. Todo lo que dependa de una interfaz de usuario de Windows Forms, de la selección del Explorador TOM o de un servicio en ejecución del lado de la interfaz (registro de macros, DAX Formatter en línea, Analizador VertiPaq en tiempo real) se comporta de forma diferente; por lo general, queda vacío, no hace nada o devuelve un error.
| Limitación |
Notas / Solución alternativa |
System.Windows.Forms no se ha cargado |
La CLI usa una compilación multiplataforma de TOMWrapper que elimina todo el código acoplado a WinForms; el ensamblado de WinForms nunca se carga en el AppDomain. Los scripts que hacen referencia a tipos de System.Windows.Forms (MessageBox, Form, selectores de archivos, cuadros de diálogo personalizados, …) no se pueden compilar. Reestructura cualquier interacción con la interfaz de usuario en variables de entorno o entrada por stdin. |
Selected.<Plural> devuelve un enumerable vacío |
Selected.Tables, Selected.Measures, Selected.Columns, Selected.Hierarchies, etc. no devuelven nada en la CLI: no hay error de compilación ni de ejecución; simplemente no hay filas. Sustituye por búsquedas explícitas: Model.AllMeasures.Where(...), Model.Tables["Sales"].Measures o pasa rutas de objetos al script mediante variables de entorno o stdin. |
Selected.<Singular> genera un error en tiempo de ejecución |
Selected.Table, Selected.Measure, Selected.Column, Selected.Hierarchy, etc. devuelven un error porque requieren exactamente un objeto seleccionado de ese tipo y la selección de la CLI siempre está vacía. Haz referencia al objeto directamente, por ejemplo, Model.Tables["Sales"]. |
Selected.ActivePerspectives y Selected.ActiveCulture |
Siempre devuelven una colección vacía y null, respectivamente. Establece la perspectiva o la configuración regional explícitamente en el script si es necesario. |
Los cuadros de diálogo Select<Object> lanzan NotSupportedException |
SelectTable, SelectColumn, SelectMeasure, SelectObject, SelectObjects (y todas las sobrecargas) devuelven el siguiente error: "Los cuadros de diálogo de selección de objetos … no están disponibles en los scripts de la CLI. Preselecciona el objeto por nombre o ruta antes de ejecutar el script." Resuelve los objetivos de antemano mediante variables de entorno, la configuración o consultando el modelo. |
Info / Warning / Error / Output escriben en la consola |
Estos siguen funcionando, pero se envían a stdout/stderr en lugar de abrir un cuadro de diálogo. Nunca bloquean ni muestran un aviso para "ignorar más ventanas emergentes". Se pueden usar con seguridad en CI. Un script que llama a Error(...) hace que te script finalice con un código distinto de cero (los cambios se siguen guardando con --save); Warning e Info no lo hacen. |
ShowPrompt(...) siempre devuelve Cancel |
No es posible realizar una confirmación interactiva. Decide la respuesta de antemano mediante variables de entorno o la configuración. |
SuspendWaitForm / WaitFormVisible no hacen nada |
El indicador giratorio de "Please wait" es un elemento de la interfaz de TE3. WaitFormVisible es una bandera configurable sin efecto Visual, y SuspendWaitForm se ignora silenciosamente; los scripts existentes siguen compilando. |
host.Macro(...) / CustomAction(...) provoca un error |
La CLI no carga %APPDATA%/TabularEditor3/MacroActions.json, por lo que invocar una macro desde dentro de un script devuelve un error. Inserta la lógica de la macro en línea, llama directamente al archivo de script subyacente de la macro o invoca la macro mediante te macro run <name> con un archivo de macros de la CLI (--macros / TE_MACROS_PATH / la clave de configuración macros). |
table.GetCardinality() / column.GetTotalSize() devuelven 0 |
Los auxiliares de cardinalidad de VertiPaq dentro del script no tienen un VPA en vivo en el host de la CLI. Para obtener estadísticas de VPA, carga explícitamente un VPAX y usa host.Vpa.*, o ejecuta te vertipaq. |
Best Practice Analyzer
| Limitación |
Notas / Solución alternativa |
| Las fuentes de reglas de BPA deben ser URL HTTPS o rutas de archivos locales |
Solo se aceptan las URL https:// y las rutas de archivo locales sin esquema. http:// se reconoce, pero se rechaza deliberadamente en tiempo de carga con un error claro; como las reglas de BPA son expresiones de reglas ejecutables, obtenerlas a través de un canal no autenticado supondría un riesgo de manipulación. Otros esquemas de URL (file://, ftp://, …) no se admiten. Se aplica tanto a te bpa run --rules como a la lista de reglas configurada mediante te config set. |
La validación de las URL de las reglas se realiza en el gate, no en te config set |
Un error tipográfico como http:// lo acepta te config set y solo sale a la luz cuando BPA se ejecuta realmente. Después de editar las fuentes de reglas configuradas, ejecuta te bpa run (o te validate) una vez para comprobar que cada URL se carga correctamente. |
--rules no desactiva las reglas integradas |
Cuando se pasa te bpa run --rules <path-or-url>, las reglas proporcionadas sustituyen las entradas de bpa.rules y TE_BPA_RULES para esa invocación, pero los valores predeterminados integrados siguen cargándose también. Para ejecutar solo el archivo de reglas explícito, pasa también --no-defaults. Cuando un archivo de reglas proporcionado define el mismo identificador de regla que una regla integrada, la regla se evalúa una sola vez: la definición del archivo --rules explícito prevalece en esa invocación de te bpa run (en la comprobación de implementación/guardado, prevalece la definición integrada). |
No hay ninguna opción por invocación para omitir la configuración de bpa.rules |
Una vez configurado bpa.rules, cada te bpa run carga esas reglas además de las integradas. Actualmente no hay ninguna opción para omitir los archivos de reglas configurados en una sola ejecución. Solución alternativa: pasa --rules <path-or-url> explícitamente; esta opción sustituye por completo bpa.rules y TE_BPA_RULES para esa invocación. |
Validación
| Limitación |
Notas / Solución alternativa |
te validate no puede corregir automáticamente las infracciones de Code Action |
te validate genera un Report de infracciones de Code Action, pero no ofrece ningún parámetro de la CLI para aplicar la corrección sugerida. Aplica la corrección en Tabular Editor 3, o usa te bpa run --fix para el subconjunto de Code Actions que se solapan con las reglas de BPA. |
Inicialización del modelo y guardado
| Limitación |
Notas / Solución alternativa |
--serialization no puede combinar una serialización con un contenedor PBIP |
La opción --serialization en te save-as trata bim, tmdl, Database.json y pbip como mutuamente excluyentes, por lo que no es posible generar un contenedor PBIP completo alrededor de un modelo serializado con TMSL (.bim). Para envolver una salida de tmdl o bim en una carpeta {modelName}.SemanticModel/ con los archivos .platform y definition.pbism, usa --supporting-files; para un PBIP completo (incluido el artefacto Report), usa --serialization pbip. |
Edición del modelo
| Limitación |
Notas / Solución alternativa |
| No puedes crear, eliminar ni mover conjuntos calculados desde la CLI |
Puedes acceder a los conjuntos para inspeccionarlos (te list Sets, te get "Sales/Sets/<name>"), pero te add, te remove y te move no admiten objetos de conjunto. Usa te script para modificar conjuntos. |
| No hay formato masivo de Power Query para todo el modelo |
te set <path> --format <Property> da formato a las propiedades de Named Expression de un objeto, y te util format-m da formato a una única expresión suelta, pero no hay ningún comando para dar formato a todas las expresiones M de un modelo de una sola vez. (El formato DAX para todo el modelo está disponible mediante te script --inline "Model.AllMeasures.FormatDax();" --save.) |
| La sincronización de esquema trata las columnas de origen renombradas como eliminadas + añadidas |
te set <table> --update-schema no puede detectar un cambio de nombre; una columna de origen renombrada aparece como una eliminada y otra nueva. Reasígnala manualmente con te set <table>/<column> -p SourceColumn=<newName> antes de sincronizar. --update-schema no se admite en tablas calculadas y grupos de cálculo. |
Autenticación
| Limitación |
Notas / Solución alternativa |
| Solo una identidad almacenada en caché por método de autenticación |
La CLI almacena en caché una identidad UPN (interactiva) y una identidad SPN (entidad de servicio) a la vez. Cambiar a otro usuario o inquilino con el mismo método de autenticación requiere te auth logout y después volver a ejecutar te auth login, lo que invalida la caché anterior. |
Entrada en la línea de comandos
| Limitación |
Notas / Solución alternativa |
| Las rutas de objetos DAX con espacios deben ir entre comillas del shell |
Cuando el nombre de una tabla o columna contiene espacios, toda la referencia al objeto DAX debe ir entre comillas del shell desde el terminal: te get "'My Table'[My Column]". Sin las comillas externas, el shell divide la ruta en varios argumentos y el análisis sintáctico falla. Dentro de te interactive no se necesitan comillas del shell porque el REPL recibe la entrada sin procesar antes de que el shell la divida en argumentos. |
| Los nombres de objeto que contienen caracteres reservados de ruta deben ir entre comillas |
/ [ ] ' " * ? { }están reservados en las rutas de objeto y de filtro. Un nombre que contenga uno de ellos debe ir entre comillas según las reglas de comillas de los segmentos; por ejemplo,te get "Tables/'{foo}'"ote get 'Sales/"my*name"'. ?está reservado, pero no tiene significado de comodín. La shell de Windowscmd.exeno puede expresar las formas con comillas mixtas; usa PowerShell o una shell POSIX para esos nombres (ote interactive`, que toma la línea sin procesar). |
- (leer desde stdin) no está disponible dentro de te interactive |
La shell lo rechaza con '-' (stdin) no está disponible dentro de la shell interactiva. Pasa el valor directamente en el comando, o ejecútalo desde la shell del sistema operativo, donde las canalizaciones sí funcionan. |
Enviar un Report de una limitación no documentada
Si algún comportamiento te sorprende y no aparece aquí, abre una incidencia en TabularEditor/CLI e incluye el comando que ejecutaste, la salida que viste y la salida que esperabas. Las limitaciones confirmadas se añaden a esta página en la siguiente versión.
Páginas relacionadas