1 votes

Comment faire pour que cmd lise les entrées avec des espaces comme des termes/variables différents ?

Quand je veux que mon lot soit alimenté, j'utilise :

set /p myvar=Type here:

En exécutant le code et en saisissant quelque chose comme ceci avec espaces :

C'est l'entrée.

Je peux avoir les quatre mots séparément assigné comme certaines variables, comme

1=This
2=is
3=the
4=input.

Pour que je puisse utiliser ces variables (%1%, %2%, %3%, %4%) comme je le souhaite ?

Ou existe-t-il une autre commande d'entrée pour cela ?

2voto

iTwasnTme Points 5586
@echo off && title <nul 

title .\%~nx0 && color 0a
cd /d "%~dp0" && mode 50,10
setlocal enabledelayedexpansion

>con: echo/ & set /p "_myvar=Enter your Input:"

set "_myvar_0=%_myvar: =" & set/a "_i+=1+0" & set "_myvar_!_i!=%"
<con: ^< nul rem./ && for /l %%l in (0 1 !_i!)do echo=!_myvar_%%~l! 

endlocal & goto=%:EOF

Vous pouvez essayer d'utiliser un tableau, avec une méthode postée sur dostips.com /par @Aacini

Le code de mise en page original ressemble à ceci :

set "_myvar=%_myvar: ="&set /a i+=1&set "_myvar[!i!]=%"

Je préfère remplacer [ ] à un simple _

Aussi, changez i+= à _i+=1+0 où il n'est pas nécessaire de prédéfinir set commandement : set i=0

set "_myvar_0=%_myvar: =" & set/a "_i+=1+0" & set "_myvar_!_i!=%"

1. Vous pouvez accéder à toutes les occurrences en utilisant son délimiteur défini par des espaces.

set "%_myvar: ="      ==>      "%_myvar:space="

2. La méthode utilise un compteur où la limite est le total stocké dans !_i! .

set /a _i+=1+0

3. Utilisation d'un for /L boucle vous avez accès à toutes les occurrences, de 0 à la limite !_i! :

for /l %%l in (0 1 !_i!)do...

4. En concaténant la variable %%l dans la boucle avec le nom attribué à la variable _myvar_ vous obtenez les valeurs de chaque occurrence...

for /l %%l in (0 1 !_i!)do echo=!_myvar_%%~l!

enter image description here

2voto

T3RR0R Points 417

Une approche macro alternative pour la définition des tableaux :

@Echo off
rem /* Array macro definition occurs prior to delayed expansion being enabled */
 Set "DefUserArr=Set "#{i}=0"& Set /P "String=Enter #:"& For %%G in (!String!)Do (Set /a "#{i}=!#{i}!+1" & Set "#[!#{i}!]=%%G")"
rem /* Enable delayed expansion in order to expand the macro */
 Setlocal EnableDelayedExpansion
rem /* Supply the variable name to be used for the Array group using substring modification as the macro is expanded */
 %DefUserArr:#=Value%
rem /* Access the Group elements using the reference variable */
 Set Value[
rem /* Groups begin from a '1' index and group count is referenced via the Groupname{i} variable */
 Set Value{i}
 Endlocal

exemple d'entrée-sortie :

C:\Users\tcdou>inputA
Enter Value:one two&<> three^!^!
Value[1]=one
Value[2]=two&<>
Value[3]=three!!
Value{i}=3

Bien entendu, si votre script est destiné à un utilisateur autre que vous-même, vous pouvez au moins vérifier que la saisie a été effectuée et que le "tableau" a été défini avant de l'utiliser. Vous trouverez ci-dessous une version légèrement plus robuste qui illustre une macro. ?ArrDef qui teste ceci :

@Echo off & Setlocal DISABLEdelayedexpansion
rem /* Array macro definition occurs prior to delayed expansion being enabled */
 Set "DefUserArr=Set "String="&For %%n in (1 2)Do if %%n==2 ((If /I Not "!Switch!" == "-A" (For /F "Tokens=1,2 Delims==" %%v in ('2^> Nul Set #[')Do Set "%%~v=" & Set "#{i}=0")) & Set /P "String=Enter #:"& For %%G in (!String!)Do (Set /a "#{i}=!#{i}!+1" & Set "#[!#{i}!]=%%~G"))Else Set Switch="
 Set "?ArrDef=For %%n in (1 2)Do if %%n==2 ( If "!#{i}!" == "" ( For %%G in (!Actions!)Do %%~G )Else If "!#{i}!" == "0" ( For %%G in (!Actions!)Do %%~G ))Else Set Actions="
rem /* Enable delayed expansion in order to expand the macro */
 Setlocal EnableDelayedExpansion
rem /* Supply the variable name to be used for the Array group using substring modification as the macro is expanded */
:Input1
 %DefUserArr:#=Value%
rem /* test if array defined */
 %?ArrDef:#=Value% "Echo/Inital input required" "Goto :Input1"
rem /* Access the Group elements using the reference variable */
 Set Value[
rem /* Groups begin from a '1' index and group count is referenced via the Groupname{i} variable */
 Set Value{i}
rem /* append to the array using the -A switch */
 %DefUserArr:#=Value%-A
 Set Value[
 Set Value{i}
rem /* Using the DefUserArr macro without the -A switch will remove any preexisting values for the supplied group name. */
:Input3
 %DefUserArr:#=Value%
 %?ArrDef:#=Value% "Echo/New input required" "Goto :Input3"
 Set Value[
 Set Value{i}
 Endlocal & Endlocal

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X