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 versión preliminar dejará de funcionar después del 2026-10-31. No recomendamos usar la CLI en pipelines de CI/CD de producción mientras esté en 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 las cosas que todavía no puede hacer, para que puedas planificar teniendo en cuenta ambos aspectos 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 alternativa 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. Refactoriza cualquier interacción con la interfaz de usuario para que use 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 las rutas de los objetos al script mediante variables de entorno o entrada por 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 a partir de 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. |
ShowPrompt(...) siempre devuelve Cancel |
No es posible realizar una confirmación interactiva. Decide la respuesta de antemano mediante variables de entorno o 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(...) provocan un error |
La CLI no carga %APPDATA%/TabularEditor3/MacroActions.json, por lo que invocar una macro desde dentro de un script devuelve un error. Integra la lógica de la macro, llama directamente al archivo de script subyacente de la macro o invócala mediante te macro run <name> con un archivo de macros para 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 se cargan igualmente. Para ejecutar solo el archivo de reglas explícito, pasa también --no-defaults. Si 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 despliegue/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 y guardado del modelo
| Limitación |
Notas / Solución alternativa |
--serialization no puede combinar una serialización con un contenedor PBIP |
La opción --serialization de te save-as trata bim, tmdl, Database.json y pbip como mutuamente excluyentes, por lo que no se puede generar un contenedor PBIP completo alrededor de un modelo serializado con TMSL (.bim). Para encapsular una salida tmdl o bim en una carpeta {modelName}.SemanticModel/ con los archivos .platform y definition.pbism, pasa --supporting-files; para un PBIP completo (incluido el artefacto del Report), usa --serialization pbip. |
Edición del modelo
| Limitación |
Notas / Solución alternativa |
| Los conjuntos calculados no se pueden crear, eliminar ni mover desde la CLI |
Se puede 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 tipo conjunto. Usa te script para modificar conjuntos. |
| No existe un formateo de Power Query para todo el modelo |
te set <path> --format <Property> da formato a las propiedades de las Named Expression en un objeto y te util format-m da formato a una única expresión independiente, pero no hay ningún comando para dar formato a todas las expresiones M de un modelo en una sola pasada. (El formato DAX para todo el modelo está disponible mediante te script --inline "Model.AllMeasures.FormatDax();" --save.) |
| La sincronización del esquema trata las columnas de origen renombradas como eliminadas y añadidas |
te set <table> --update-schema no puede detectar un cambio de nombre; una columna de origen renombrada aparece como una columna eliminada y otra nueva. Reasigna 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 la ruta deben ir entre comillas |
/ [ ] ' " * ? Los caracteres { } están reservados en las rutas de objetos y filtros. Un nombre que contenga uno de ellos debe ir entrecomillado siguiendo las reglas de entrecomillado de segmentos; p. ej., te get "Tables/'{foo}'" o te get 'Sales/"my*name"'. ? está reservado, pero no tiene significado de comodín. La consola cmd.exe de Windows no admite las formas con comillas mixtas; utiliza PowerShell o una shell POSIX para esos nombres (o te interactive, que toma la línea sin procesar). |
- (leer desde stdin) no está disponible en te interactive |
La shell lo rechaza con '-' (stdin) no está disponible dentro de la shell interactiva. Pasa el valor en la misma línea o ejecuta el comando desde la shell de tu sistema operativo, donde funcionan las tuberías. |
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