web-dev-qa-db-fra.com

Pourquoi ce code dit-il que l'écho est désactivé?

Quel est le problème avec ce code? Il dit ECHO is off.

@ECHO off
set /p pattern=Enter id:
findstr %pattern% .\a.txt > result
if %errorlevel%==0 (
set var2= <result
echo %var2%
set var1=%var2:~5,3%
echo %var1% > test.txt
echo %var1%
) else (
echo error
)
del result
pause

Toute aide est appréciée.

22
user1979801

Si votre variable est vide quelque part, ce sera la même chose que d'avoir la commande "echo" seule, qui affichera simplement le statut d'écho.

Pour éviter cela, vous devez remplacer toutes vos commandes echo par quelque chose comme ceci:

echo var2: %var2%

De cette façon, si %var2% est vide, cela affichera simplement "echo var2:" au lieu de "echo off".

29
this.lau_

Comme Laurent l'a dit, ce n'est pas un problème de ECHO, c'est un problème de code.

Dans les fichiers de traitement par lots, les blocs sont complètement analysés avant leur exécution.
Lors de l'analyse de tous les pourcentages d'expansion, il semble que vos variables ne puissent pas être modifiées à l'intérieur d'un bloc. 

Mais pour cela existe l'expansion retardée, l'expansion retardée sera évaluée au moment de l'exécution et non lors de l'analyse du bloc.

Il doit être activé. Par défaut, l’extension différée est désactivée.

@ECHO off
setlocal EnableDelayedExpansion
set /p pattern=Enter id:
findstr %pattern% .\a.txt > result
if %errorlevel%==0 (
  set var2= <result
  echo(!var2!
  set var1=!var2:~5,3!
  echo(!var1! > test.txt
  echo(!var1!
) else (
  echo error
)
del result

J'ai utilisé ici la construction echo( au lieu de echo car cela garantira l'écho d'une ligne vide même si la variable est vide.

18
jeb

Pas sûr, si ce message est toujours lu, mais quand même .. Vous devriez essayer ce qui suit: En haut du code juste après @echo off vous devez mettre dans

 setlocal enabledelayedexpansion

De plus, partout où vous souhaitez utiliser des variables modifiées entre crochets (comme For-Loops ou If's), vous devez modifier le %into ! pour obtenir !varname!

Cela devrait aider ...

Salutations

geisterfurz007

5
geisterfurz007

enter image description hereCommencez par créer un fichier a.txt dans le même répertoire que ce fichier de commandes ... écrivez du texte dans ce ... Remarque: uniquement sous Windows 2000Windows MEWindows XPWindows Vista Windows 7 prend en charge FINDSTR

set /p pattern=Enter id:
findstr %pattern% a.txt > __query.tmp
set /p result=<__query.tmp
if %errorlevel%==0 (
set var2= %result%
echo %var2%
set var1= %var2:~5,3%
echo %var1% > test.txt
echo %var1%
) else (
echo error
)
del __query.tmp
pause

lancez ce fichier bath .. vous trouverez une sous-chaîne (début = 5, longueur = 3) de la première ligne de chaîne que vous avez dans un fichier .txt dans un fichier test.txt nouvellement créé. Enfin, ça marche!

0
Manoj Purohit

La solution à votre problème consiste à mettre les "échos" après la fin du bloc if. Essaye ça: 

@ECHO off
set /p pattern=Enter id:
findstr %pattern% .\a.txt > result
if %errorlevel%==0 (
    set var2= <result
    set var1=%var2:~5,3%
    goto print 
) else (
    echo error
    goto result
)
:print
echo %var2%
echo %var1% > test.txt
echo %var1%

:result
del result
pause

De cette façon, vous pouvez voir la solution à votre guise. À votre santé! ;] 

0
jfajunior