Notions de base la programmation de BATCH
L'environnement BATCH a existé depuis 1981 avec la sortie de MS-DOS de Microsoft et est également disponible dans PC-DOS d'IBM et DR-DOS de Digital Research. Différentes saveurs de DOS-Windows* ont également eu l'environnement BATCH en incorporant une version de un flaveur de DOS.
La sortie de OS/2 d'IBM et Windows NT de Microsoft a introduit l'interface de commande (Command Shell), qui est fonctionnellement équivalent à l'environnement BATCH.
L'environnement BATCH ou «Command Shell» est extrêmement limitée, et a presque toujours été étendu grâce à des outils externes. Pour MS-DOS, il était populaire à utiliser des scripts QBASIC et déboguer des scripts en langage d'assemblage, et avec PC-DOS, IBM a fourni l'environnement de script REXX, tandis que d'autres ont utilisé autre commande shell est comme 4DOS. 4DOS a été publié en open source et est en dehors de FreeDOS.
Dans les versions modernes de Windows qui sont basés sur Windows NT, BATCH est devenu populaire pour le rôle de l'ingénierie des systèmes pour différents logiciels orientés cloud comme une solution. L'environnement est encore limitée et se prolonge souvent l'aide de VBScript, utilitaires UNIX qui ont été porté sur Windows, des outils tels que les internes du système ou script langauges comme Perl, Python et Ruby, ou PowerShell.
Windows
Ces versions de Windows exigent DOS pour fonctionner. Le système DOS comprend l'environnement BATCH.
Windows Version | Marketing Name | Bundled DOS |
---|---|---|
Windows 3.1 | Windows 3.1 | DOS 3.3 or higher required |
Windows 4.0 | Windows 95 | MS-DOS 7.0 bundled |
Windows 4.1 | Windows 98 | MS-DOS 7.1 bundled |
Windows 4.9 | Windows Me | MS-DOS 8.0 bundled |
Sortie
Voici comment on peut sortir du texte à l'écran, ou en informatique STDOUT (sortie standard).
@ECHO "Hello"
Variables
En informatique, les variables sont un nom symbolique associé à une valeur et dont la valeur associée peut être changé. En l'environnement BATCH, il n'y a pas de type de donnée pour les variable. Toutes les variables sont simplement des chaînes. Notez que les noms de variables ne sont pas sensibles à la casse.
@ECHO off SET num=5 SET char=a SET str=This is a string ECHO Number is %num% ECHO Character is ^'%char%^' ECHO String is ^"%str%^"
Arithmétique
L'environnement BATCH a un support limité pour les mathématiques simples avec la commande «SET».
@ECHO off REM integer arithmatic math example SET width=5 SET length=6 SET /a area=width * length REM output integer arithmatic math results ECHO The area of a square(width=%width%,length=%length%) is %area% REM boolean logic example SET true=1 SET false=0 SET group_a=%true% SET group_b=%false% SET group_c=%true% REM Note -- Windows/DOS Batch/Cmd doesn't support boolean logic math, REM so we need nested IF conditions to simulate boolean logic math REM result = group_a & group_b IF %group_a% == %true% ( IF %group_b% == %true% (SET result=%true%) ELSE (SET result=%false%) ) ELSE (SET result=%false%) REM result = result | %true% IF %result% == %false% ( IF %group_c% == %true% (SET result=%true%) ) REM output boolean logic math results ECHO The statement (true AND false OR true) is %result%
L'environnement Batch ne peut calculer les mathématiques simples. Rien de plus nécessite l'utilisation d'un autre environnement comme VBScript. Un excellent site pour le traitement des calculs en virgule flottante est http://www.celticproductions.net/articles/11/batch+files/add+floating+point+numbers+in+batch+file.html. Cela montre une solution pour générer du code VBScript, exécutez le script, puis recueillir les résultats de la production. VBScript peut également traiter certains triganometry.
Pour cosinus sans VBScript, visitez ce site: http://www.robvanderwoude.com/cosine.php.
Pour cosinus sans VBScript, visitez ce site: http://www.robvanderwoude.com/cosine.php.
Entrée
C'est la façon d'obtenir la saisie au clavier, ou en informatique STDIN (entrée standard).
@SET /p name=Enter your name: @ECHO Hello %name%
Choix
La branche est un point où un flux logiciel est modifié. Essentiellement, le logiciel choisit un chemin après l'évaluation d'un test.
@echo off REM get input SET /p number=Input a number: REM evaluate 3 conditions (if/elseif/else construct not supported) IF %number% gtr 0 (ECHO Number is greater than 0) IF %number% lss 0 (ECHO Number is less than 0) IF %number% equ 0 (ECHO Number is 0)
La construction de «case» permettra de comparer une chaîne à un motif. Si le motif trouve une correspondance, un bloc de code est exécuté.
Malheureusement, l'environnement BATCH n'a pas de soutien direct à cette fonctionnalité. Nous pouvons simuler le comportement grâce à l'utilisation des étiquettes et des instructions «GOTO».
Afin de correspondre à un modèle, nous devons utiliser un outil externe, tels que le commandement «FINDSTR» inclus dans certaines versions de Windows. La commande «FINDSTR» supporte quelques expressions régulières, mais il ne peut pas faire la distinction entre les lettres minuscules ou majuscules.
Malheureusement, l'environnement BATCH n'a pas de soutien direct à cette fonctionnalité. Nous pouvons simuler le comportement grâce à l'utilisation des étiquettes et des instructions «GOTO».
Afin de correspondre à un modèle, nous devons utiliser un outil externe, tels que le commandement «FINDSTR» inclus dans certaines versions de Windows. La commande «FINDSTR» supporte quelques expressions régulières, mais il ne peut pas faire la distinction entre les lettres minuscules ou majuscules.
@echo off REM get input set /p keypress=Input a character: REM Simulate case/switch through labels, goto, and if REM Test for digit with Findstr ECHO %keypress% | FindStr /R "[0-9]" IF %ERRORLEVEL% EQU 0 (ECHO "Digit") & (GOTO ENDCASE) REM Test for alpha-numeric (cannot test for case) REM Findstr cannot distinguish case, for it uses broken RegEx engine ECHO %keypress% | FindStr /R "[A-Z]" IF %ERRORLEVEL% EQU 0 (ECHO "Alphabet character") & (GOTO ENDCASE) REM Default output if nothing is found ECHO "Punctuation, whitespace, or other" :ENDCASE
Boucles
Une boucle est une séquence d'instructions qui est spécifié une fois mais qui peut être réalisée plusieurs fois de suite.
Il y a une boucle commandée par un compter. Cette boucle compte de 10 à 1.
Il y a une boucle commandée par un compter. Cette boucle compte de 10 à 1.
@ECHO OFF FOR /l %%C in (10,-1,1) DO ( ECHO Count is %%C )
Il y a une boucle commandée par un état. L'utilisateur de déterminer l'état. Lorsque l'utilisateur tape "quit" la boucle se termine.
@ECHO OFF REM Note that BATCH does not have conditional loop constructions, REM but it can be simulated through labels and goto statements. :LOOP SET /p answer=Enter your name (quit to Exit): IF "%answer%"=="quit" GOTO END ECHO Hello %answer% GOTO LOOP :END
Il y a une boucle commandée par un ensemble d'éléments (collection).
@ECHO OFF REM Note: Batch FOR loop will glob only files or only REM directories with /d, but not both. REM iterate through each line returned from subshell FOR /F "usebackq" %%I IN (`cmd /c dir /b`) DO ( REM test if item is a directory IF EXIST %%I\NUL ( ECHO %%I is a directory ) ELSE ( ECHO %%I is not a directory ) )
Tableaux
Le Command Shell ne prend pas en charge les tableaux. Cette fonctionnalité peut être émulé avec le boucle for. Voici un blog qui décrit ce processus: http://jakash3.wordpress.com/2009/12/18/arrays-in-batch/.
Tableaux associatifs
Le Command Shell ne prend pas en charge les tableaux associatif.
Fonction
Une fonction est une portion de code représentant un sous-programme qui effectue une tâche et qui renvoie une valeur. Dans l'environnement de BATCH,...
@ECHO OFF :: Call the function CALL :SHOWDATE GOTO :EOF :: Create the function :: NOTE - This only works for US locality :SHOWDATE SET year=%DATE:~10,4% SET mon=%DATE:~4,2% SET day=%DATE:~7,2% if %mon%==01 set mon=JAN if %mon%==02 set mon=FEB if %mon%==03 set mon=MAR if %mon%==04 set mon=APR if %mon%==05 set mon=MAY if %mon%==06 set mon=JUN if %mon%==07 set mon=JUL if %mon%==08 set mon=AUG if %mon%==09 set mon=SEP if %mon%==10 set mon=OCT if %mon%==11 set mon=NOV if %mon%==12 set mon=DEC ECHO Today is %mon% %day%, %year% GOTO :EOF
Arguments (Paramètres positionnels)
Un système d'exploitation prend en charge la fonctionnalité pour envoyer des paramètres (appelés options ou «flags») à un programme. Ils sont également appelés arguments de la ligne de commande. L'environnement du shell utilise les paramètres positionnels pour traiter ces arguments en ligne de commande.
Un paramètre de position est représentée par une variable ordinale particulière comme $1, $2, $3, et ainsi de suite. Le nombre maximum d'arguments envoyés au script est représenté par $#. Le script lui-même est appelé $0.
Un paramètre de position est représentée par une variable ordinale particulière comme $1, $2, $3, et ainsi de suite. Le nombre maximum d'arguments envoyés au script est représenté par $#. Le script lui-même est appelé $0.
@ECHO off REM calculate count of arguments SET /A argc=0 FOR %%A IN (%*) DO SET /A argc+=1 REM check if 2 arguments were passed IF %argc% lss 2 ( ECHO You need to enter two numbers: ^"%0^" num1 num2 ) ELSE ( REM calculate summation of two arguments SET /A sum=%1+%2 ECHO %sum% ECHO The sum of %1 and %2 is: %sum% )
Voici une méthode pour lister les arguments. La commande «shift» est utilisée pour changer la position des paramètres. Lorsque «shift» est utilisé, tous les paramètres seront décalées vers le haut. Ainsi, «$3» deviendra «$2», «$2» deviendra «$1» et «$1» sera effacé. Comme cela se produit, la variable «$#» décrémente.
@echo off :: get the total number of arguments SET /A argc=0 FOR %%A IN (%*) DO SET /A argc+=1 :: set initial counter SET /A count=1 :: Enumerate arguments (print them) :: NOTE: shift will not work inside FOR loop, so we do this :LOOP :: exit loop if we processed them all IF "%count%"=="%argc%" GOTO END :: output results ECHO item %count%: %1 :: increment counter SET /A count+=1 :: move next argument into %1 SHIFT GOTO LOOP :END
Dans une autre méthode pour lister les arguments, nous pouvons utiliser explicitement un certain nombre. Pour cela, il faudra utiliser la commande «eval».
#!/bin/sh count=$# # initialize counter echo "The arguments passed are (reverse order):" while [ $count -ge 1 ]; do eval param=\$$count # store positional parameter echo " item $count: $param" # output result count=$(( $count - 1 )) # decrement counter done
Paramètres des fonctions
Dans l'environnement du shell, les paramètres positionnels sont utilisés pour contenir les paramètres passés à une fonction. Ils fonctionnent exactement de la même manière que les arguments de ligne de commande.
#!/bin/sh add() { sum=0 for num in "$@"; do sum=$(( $sum + $num )) done echo The summation is: $sum } add 5 2 4 3 6