2016-02-21 1 views
1

%x:~12,3% Renvoie 3 caractères à partir du 12ème caractère dans la variable x. Ce que j'ai essayé d'accomplir utilise des variables au lieu de 12 et 3. Disons par exemple et z=3. Ensuite, vous ne pouvez pas utiliser %x:~%y%,%z%%, car CMD pensera que %x:~% est une variable.CMD: pipetage ECHO pour définir/étendre les variables dans les variables

Ce que vous pouvez faire est set var=%%x:~%y%,%z%%%. Cela étendra les variables internes y et z, mais pas x, de sorte que la valeur de var soit %x:~12,3%. La tâche restante actuelle est de développer enfin %x:~12,3%. J'ai essayé d'ajouter echo au début de sorte que var=echo %x:~12,3%. Si vous utilisez maintenant %var% dans la ligne de commande ou dans un fichier séquentiel, la commande echo doit être exécutée et l'expression suivante doit être développée, mais pas echo %x:~12,3% à la place %x:~12,3% est imprimée à l'écran, non expansée.

Je pensais que peut-être si vous définissez var %x:~12,3%, puis l'écho et conduit la sortie dans une autre commande ECHO ou SET commande que l'expression serait élargie, mais il semble que ECHO et SET n'accepte pas les données être canalisé dans tout cela?

Comment est-ce que je peux faire ce travail?

+1

Ce type de gestion est expliquée à: http://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other-data-structures-in -cmd-exe-batch-script/10167990 # 10167990 – Aacini

+0

Vraiment, où exactement? J'ai regardé cette page mais je n'ai rien trouvé sur l'utilisation de variables pour spécifier une partie d'une chaîne à extraire. – user504882

+0

Comme je l'ai dit, ce type de gestion est expliqué à ce lien, c'est-à-dire, comment utiliser la valeur de _une autre variable_ dans l'expansion de l'original. Voir [ma réponse] (http://stackoverflow.com/questions/35532216/cmd-piping-echo-to-set-expanding-variables-in-variables/35538235#35538235) ci-dessous. – Aacini

Répondre

1

Vous devez activer l'extension différée.

@echo off 
setlocal enabledelayedexpansion 

set string=1234567890abcdef 
set substring_start=12 
set substring_length=3 

set substring=!string:~%substring_start%, %substring_length%! 
set command=echo !substring! 

!command! 
pause 
+0

Vous ne savez pas pourquoi EnableDelayedExpansion ne fonctionne pas directement sur la ligne de commande? – user504882

+0

@ user504882 - ce n'est pas destiné à. Vous ne pouvez pas utiliser le schéma de nommage '! Var!' Sur la ligne de commande. À mon humble avis, vous ne devriez pas du tout définir des variables sur l'invite de commande. – SomethingDark

+4

@ user504882 L'expansion retardée est désactivée par défaut sur la ligne de commande, mais elle peut être activée lorsque vous démarrez avec cmd.exe/V: on ou lorsque vous modifiez la clé de registre 'HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Command Processor \ DelayedExpansion ' – jeb

1
@ECHO OFF 
SETLOCAL 

SET "x=abcdefghijklmmopqrstuvwxyz" 

SET /a start=12 
SET /a length=3 

CALL SET "var=%%x:~%start%,%length%%%" 
ECHO var=%var% 
CALL echo %%x:~%start%,%length%%% 

SETLOCAL ENABLEDELAYEDEXPANSION 
SET /a start=6 
SET /a length=4 

SET "var=!x:~%start%,%length%!" 
ECHO var=%var% 
echo !x:~%start%,%length%! 

GOTO :EOF 

Deux méthodes - le premier en mode standard et le second en utilisant delayedexpansion. Il y a des centaines d'exemples sur SO à propos de l'expansion retardée.

+0

Le problème avec 'CALL SET' est qu'il démarre une nouvelle instance de CMD en cours d'exécution, ce qui le rend beaucoup plus lent. – user504882

+0

@ user504882 Non, 'CALL' ne démarre pas une nouvelle instance, normalement c'est lent mais cela peut être rapide quand vous utilisez' set pathext =: '. Btw. 'FOR/F' démarre une nouvelle instance, un canal démarre deux nouvelles instances. – jeb

3

J'ai copié le texte entier ci-dessous de this answer; Je viens de modifier les noms des variables et des exemples particuliers pour correspondre à ceux de cette question:

%x:~12,3% renvoie 3 caractères à partir du 12: e caractère variable x . Ce que j'ai essayé d'accomplir est en utilisant les variables au lieu de 12 et 3. Disons y=12 et z=3.


Si vous souhaitez utiliser une autre variable pour la position de sous-chaîne et longueur, alors vous devez savoir que le remplacement des variables enfermées dans leurs valeurs par pourcents est analysée de gauche à droite; cela signifie que: %x:~%y%,%z%% ne donne pas le résultat souhaité car cela signifie: afficher la valeur de x:~ variable, suivie de y, suivie de la valeur de , variable, etc.

Pour résoudre ce problème, vous devez utiliser Expansion retardée, qui est, insérez commande setlocal EnableDelayedExpansion au début, entourez les variables de sous-chaîne en pourcents, et enferment la variable d'origine en points d'exclamation:

setlocal EnableDelayedExpansion 
set x=ABCDEF 
set y=12 
set z=3 
set var=!x:~%y%,%z%! 

Vous pouvez également utilise les paramètres des commandes FOR en tant qu'index: for /F "tokens=1,2" %%i in ("%y% %z%") do set var=!x:~%%i,%%j!.

Pour obtenir la valeur d'une sous-chaîne lorsque l'index change dans FOR/IF, placez la variable en double pour cent et précedez la commande avec call. Par exemple, pour afficher une sous-chaîne à une position y aléatoire entre 0 et 12 et longueur z:

if %some% == %test% (
    set /A y=!random! %% 13 
    call echo %%x:~!y!,%z%%% 
) 

Vous pouvez également utiliser cette méthode entre parenthèses dehors afin d'éviter l'expansion retardée:

call echo %%x:~%y%,%z%%% 

Une autre façon de réaliser le processus précédent consiste à utiliser une commande FOR supplémentaire pour modifier l'expansion retardée de l'index par un paramètre remplaçable équivalent, puis à utiliser l'expansion différée pour la variable d'origine. Cette méthode run plus rapide que CALL précédent:

if %some% == %test% (
    set /A y=!random! %% 13 
    for %%y in (!y!) do echo !x:~%%y,%z%! 
) 
+0

Les deux dernières méthodes que vous décrivez pour les parenthèses 'IF' et' FOR' ne semblent pas nécessaires selon mes tests. Mes tests montrent que dans vos deux exemples ci-dessus, l'utilisation de 'ECHO! X: ~% y%,% z%!' Fonctionnerait correctement. – user504882

+0

La description à la [réponse d'origine] (http://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other-data-structures-in-cmd-exe-batch-script/10167990#10167990) est un général qui couvre tous les aspects possibles de cette gestion. Si vous n'avez pas besoin de certains de ces points, ne les utilisez pas (vous en aurez peut-être besoin plus tard). Si vous pensez que cette réponse est utile, vous pouvez cliquer sur sa coche et l'augmenter. Merci! – Aacini

+0

Puis-je vous demander de choisir ceci comme meilleure réponse? C'est important pour moi ... – Aacini