9
votes

Si sinon Problème commandant lot

J'ai un problème sur si sinon dans le script de commandes de commandement ...

dans le bloc-notes:

CODE: P>

@echo off

::SETTINGS:::::::::::::::::::::::
set filetxt =userpass.txt
set log=logfile.log
set timer=900
::set default = true
::set user = 0
::set pass = 0
:::::::::::::::::::::::::::::::::


:STARTER
ECHO.>>%log%
ECHO ========START========>>%log%
SetLocal EnableDelayedExpansion
Set n=
Set _InputFile=%filetxt%
For /F "tokens=*" %%I IN (%_InputFile%) DO (
Set /a n+=1
Set acct!n!=%%I
)
set router_ip=%acct1%
set user=%acct2%
set pass=%acct3%
GOTO :CHECKFILE1


:CHECKFILE1
CLS
IF EXIST curl.exe ( GOTO :CHECKFILE2 ) else (
ECHO ERROR: curl.exe was not found.>>%log%
ECHO ERROR: curl.exe was not found.
ECHO.
ECHO.
GOTO :PAUSEEXIT
)

:CHECKFILE2
CLS
IF EXIST sleep.exe ( GOTO :CHECKACCOUNT ) else (
ECHO ERROR: sleep.exe was not found.>>%log%
ECHO ERROR: sleep.exe was not found.
ECHO.
ECHO.
GOTO :PAUSEEXIT
)

:CHECKACCOUNT
if /I "%user%"=="insertusername" GOTO ACCOUNT
GOTO CHECKPASSACCT

:CHECKPASSACCT
if /I "%pass%"=="insertpassword" GOTO ACCOUNT
GOTO COUNTER

:ACCOUNT
CLS
::if %default% = true ( GOTO :COUNTER ) ELSE (
ECHO To edit/change USERNAME and PASSWORD... Please type: OPTION
ECHO.
SET /P user="Please enter the username of your Router:"
IF /I %user%==OPTION ( Goto :EDITBAT )
CLS
ECHO To edit/change USERNAME and PASSWORD... Please type: OPTION
ECHO.
SET /P pass="Please enter the password of your Router:"
IF /I %pass%==OPTION ( Goto :EDITBAT )
CLS
set /a i = 1
GOTO :CHECKACCOUNT
::)

:EDITBAT
start /WAIT notepad %filetxt%
set router_ip=%acct1%
set user=%acct2%
set pass=%acct3%
GOTO :CHECKACCOUNT

:COUNTER
IF %i%==0 ( GOTO :RESETROUTER ) ELSE (
ECHO WAIT %i% seconds...
sleep 1
set /a i = i - 1
CLS
GOTO :COUNTER
)


:RESETROUTER
CLS
ECHO READY to RESET....
ECHO Preparing....
sleep 2

sleep 2
CLS
ECHO Processing....
sleep 5

sleep 2
CLS
ECHO Success....
sleep 5
set /a i = %timer%
CLS
GOTO :COUNTER

:PAUSEEXIT
PAUSE

:EXIT
ECHO.>>%log%
ECHO ========END OF LOG FILE========>>%log%


0 commentaires

4 Réponses :


11
votes

Vous pouvez simplifier cela jusqu'à:

:CHECKACCOUNT
if /I "%user%"=="insertusername" GOTO ACCOUNT
GOTO CHECKPASSACCT

:CHECKPASSACCT
if /I "%pass%"=="insertpassword" GOTO ACCOUNT
GOTO COUNTER


5 commentaires

En réalité, s'il n'y a pas de code entre les deux blocs, vous pouvez le simplifier plus loin et supprimer le goto checkpassacct ligne et la ligne : checkpassacct ligne.


Lorsque vous dites que cela ne fonctionne toujours pas, quelle erreur vous donne-t-il et quelle ligne est l'erreur? Il ne peut pas être la même erreur, car le incriminé ( n'existe plus.


En outre, dans votre bloc : compteur , vous souhaitez probablement mettre % i% i% en guillemets car vous pouvez entrer ce bloc avant i est jamais défini.


L'ajout de guillemets résoudra l'erreur de syntaxe dans cette ligne, mais votre logique est toujours cassée. La variable i doit être initialisée à une valeur de démarrage valide afin que vous n'alliez jamais toucher le bloc : compteur avant de le définir explicitement. Modification du fichier de commandes et le ré-test dans la même fenêtre de shell peut provoquer des variables telles que i pour être réutilisée entre les exécutions, alors essayez d'ajouter des commandes telles que Set i = au Haut du fichier de commandes pour effacer toutes les données anciennes avant que le script s'exécute (cela peut masquer des problèmes variables non initialisés tels que celui-ci).


Aws ... sa fonctionne maintenant .. ressemble à je manque "Set i =" Merci BTA pour m'aider ... :)



18
votes

Votre erreur comme on le voit provient de mauvais formatage. Ne mettez pas tout sur 1 ligne. Utilisez plutôt ceci:

if /I "%user%"=="insertusername" (
     GOTO :ACCOUNT 
) ELSE (
     GOTO :CHECKPASSACCT 
)


2 commentaires

Si vous préférez @pipitas anser sur @BTA, car il est plus simple et n'éteignez pas la question de la question du comportement sinon . Les deux réponses sont bonnes cependant. Juste une note latérale, mais j'ai remarqué un comportement étrange appelant goto dans une boucle où elle branche vers une ligne directement au-dessus d'une instruction si . Dans ces cas, curieusement, placer un echo nul> nul ou quelque chose de similaire entre la destination et le si instruction fonctionne comme un charme.


Un peu de retard, mais la description est fausse. La syntaxe est correcte, elle est absolument valide pour utiliser si "1" == "1" (goto: label1) € (goto: label2) . goto n'a pas besoin d'une nouvelle ligne



0
votes

Vous n'avez pas besoin d'utiliser les parenthèses. Vous dites essentiellement au système "Si% l'utilisateur%% est inserve inserve (" et il demande "quel est le" ("censé faire?"


1 commentaires

Mauvais, le premier bloc de parenthèses doit être utilisé ici pour créer un bloc de commande. Sans parenthèse, l'autre ne peut pas être analysé (il fera partie de la commande goto ) et du si a échoué pour false Conditions



3
votes

Le problème n'a rien à voir avec le code indiqué!

Le problème est à p> xxx pré>

comme la variable i code> n'est pas défini, la ligne sera étendue à p>

IF ==0 ( GOTO :RESETROUTER ) ELSE (


0 commentaires