2014-04-17 2 views
1

Je travaille sur un DSL qui compilera au script de lot (pour le plaisir ...). J'essaie de faire un appel de fonction, comme ça: le DSL définit la fonction avec le paramètre nommé param1. le lot définit une étiquette avec param1 =% 1. le DSL définit un appel avec une certaine valeur. les lots définissent un appel avec la valeur après un espace.paramètre de fonction d'échappement dans le lot

Le problème est que si la valeur a un espace, il est défini comme deux paramètres. Je peux échapper à des espaces avec ^, mais si j'essaie d'échapper à une double citation, cela devient foiré.

Quelqu'un peut-il m'aider avec le paramètre ultime par lots échapper?

BTW, son écrit avec MPS, et il est ici si vous voulez: https://github.com/TheAnosmic/MPSBatch

Répondre

0

Je pense qu'il n'y a aucun moyen fiable défini. L'analyseur par lots est vraiment moche. Par exemple, si vous avez une variable avec une fermeture) l'écho suivant brisera:

set VAR=Program Files (x86) 
echo var=%VAR%. 

Dans certaines circonstances, il aide à utiliser POUR

@set VAR=a * b "test" c() 
@for /F " delims==" %%V in ("%VAR%") do @echo var=%%V. 

Affichera

C:\Users>test.cmd 
var=a * b "test" c(). 
+0

Cela pourrait être une bonne solution pour les scripts, mais quand j'écris un « compilateur », je veux le script qu'il génère pour être plus beau. Je ne me soucie pas de le changer, et je peux écrire une certaine logique avec les variables, il doit y avoir un moyen de produire du code sûr et beau. – koko0

0

Le plus simple solution serait d'utiliser des guillemets doubles pour appeler votre argument.

Cependant, si cet argument contient des guillemets doubles, cela ne fonctionne pas. Dans ce cas, nous pouvons implémenter une solution basée sur la solution de eckes: nous pouvons faire une boucle dans la fonction pour lire tous les paramètres et les copier dans le paramètre de la fonction.

Par exemple, cela pourrait ressembler à ce que:

@echo off 

set var=With "" and a space 
call :call_var %var% 
goto:EOF 

:call_var 
set param= 
for /F " delims==" %%V in ("%*") do @set param=%param% %%V 
REM Test parameter 
echo %param% 
goto:EOF 
Questions connexes