Saltar al contenido principal

Compatibilidad CMD y CMDebug / TCC-RT, Parte 1

El objetivo de nuestro nuevo depurador por lotes independiente CMDebug es ejecutar archivos por lotes CMD.EXE con una compatibilidad lo más cercana posible al 100%. Les pedí a los usuarios que me enviaran cualquier archivo por lotes CMD que hubieran encontrado y que no funcionara correctamente en TCC.

Un usuario envió un archivo por lotes de Microsoft que no se pudo ejecutar TCC (y expuso un par de errores previamente desconocidos para mí (¿características?) en CMD.EXE).

El primero estaba en la forma en que llamaban al comando SET interno. Por razones desconocidas, el desarrollador optó por citar siempre los argumentos SET, es decir:

establezca "var1 = inserte su valor aquí"

Ahora bien, aunque esto era inútil, TCC (y CMDebug) no tuvo ningún problema al analizar el comando.

¿Hay casos en los que incluirías todo entre comillas dobles? Sí, por ejemplo:

establezca "var1=insertando>divertido|caracteres&aquí"

Si desea utilizar algo como un separador de comandos o caracteres de redirección, debe entrecomillarlos (o escaparlos) para evitar que el procesador de comandos los interprete como un carácter especial. Pero en el caso de este archivo por lotes, nunca hubo caracteres especiales en el valor que requirieran comillas dobles.

Por lo tanto, si TCC maneja las comillas dobles, ¿cuál fue el problema? El desarrollador también hizo algunas declaraciones parecidas a estas:

establezca "var1 = algún valor" y más texto allí

TCC Se asumió que se debería agregar “andmoretextthere” al valor de var1. Pero lo que CMD.EXE realmente hace es ignorar todo lo que sigue a la comilla doble de cierre, convirtiendo la línea en:

var1=algún valor

Esto fue inesperado para mí (e indocumentado). Y si iba a ser desechado, ¿por qué lo incluyó el autor del archivo por lotes? Ni siquiera se trata de que CMD busque cotizaciones coincidentes, por ejemplo:

establezca "var1=algún"valor"aquí"y"más"aquí

resulta en:

var1=algún"valor"aquí"y"más

Entonces CMD busca una comilla doble antes del nombre de la variable, y si encuentra una, busca la *última* comilla doble en la línea y descarta todo lo que sigue. ¿Por qué? ¿Quién sabe? ¿Por qué el desarrollador de este archivo por lotes agregó ese texto adicional después de la última cita? ¿Un error? ¿Exceso de inteligencia interna? No tengo ni idea.

Agregué un error para esto TCC, aunque a menos que cites la declaración SET completa, nunca te encontrarás con ella.

En el próximo artículo, hablaré sobre el otro problema en este archivo por lotes: un uso curioso de la sintaxis de sustitución de variables CMD y el error CMD que el autor del archivo por lotes solucionó de una manera sorprendente (al menos para TCC!) forma.