Caractéristiques cachées des fichiers Windows batch
quelles sont les caractéristiques les moins connues, mais importantes et utiles, des fichiers Windows batch?
lignes directrices:
- une caractéristique par réponse
- donne à la fois une courte description de la caractéristique et un exemple , pas seulement un lien vers la documentation
- limiter les réponses à funtionality natif , i.e., ne nécessite pas logiciel supplémentaire, comme le Windows Resource Kit
Clarification: nous nous référons ici aux scripts qui sont traités par cmd.exe, qui est la valeur par défaut sur les variantes WinNT.
(Voir aussi: fichiers Windows batch: .bat vs .cmd? )
30 réponses
suite de la ligne:
call C:\WINDOWS\system32\ntbackup.exe ^
backup ^
/V:yes ^
/R:no ^
/RS:no ^
/HC:off ^
/M normal ^
/L:s ^
@daily.bks ^
/F daily.bkf
PUSHD path
vous amène au répertoire spécifié par chemin .
POPD
vous ramène au répertoire d'où vous avez" poussé".
Je ne sais pas à quel point cela serait utile dans un fichier batch , mais c'est une commande très pratique à utiliser dans l'invite de commande:
C:\some_directory> start .
cela ouvrira L'Explorateur de Windows dans le dossier" some_directory".
j'ai trouvé cela un grand gain de temps.
j'ai toujours trouvé difficile de lire les commentaires sont marquées par un mot clé sur chaque ligne:
REM blah blah blah
plus facile à lire:
:: blah blah blah
substrats variables:
> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
Le commandement ! Bien que je déteste écrire des fichiers batch, je suis reconnaissant pour ça.
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
analyserait chaque ligne dans myfile.txt, ignorant les lignes qui commencent par un point-virgule, passant le 2e et le 3e token de chaque ligne au corps de for, avec des tokens délimités par des virgules et/ou des espaces. Notez la référence %i pour obtenir le 2e jeton, %j pour obtenir le 3e jeton, et %k pour obtenir tous les jetons restants après le 3e jeton.
vous pouvez également utiliser ceci pour itérer des répertoires, des contenus de répertoires, etc...
plutôt que de publier un script avec REM ou :: lines, je fais ce qui suit en haut de chaque script:
@echo OFF
goto :START
Description of the script.
Usage:
myscript -parm1|parm2 > result.txt
:START
notez comment vous pouvez utiliser les caractères pipe et redirection sans les échapper.
le chemin (avec le lecteur) où le script est : ~dp0
set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%
la pièce %~dp0 a déjà été mentionnée, mais il y a en fait plus à elle:
le personnage(s), d'après le ~ définissent les informations extraites.
La lettre n'est pas donner lieu à la restitution du nom de fichier du correctif
d-renvoie la lettre d'entraînement
p-renvoie le chemin
s-renvoie le chemin court
x-retourne l'extension de fichier
Donc, si vous exécutez l' script de test.bat de la c:\Temp\long dir name\ folder,
@echo off
echo %0
echo %~d0
echo %~p0
echo %~dp0
echo %~x0
echo %~s0
echo %~sp0
vous obtenez la sortie suivante
test c: \Temp\long dir name\ c:\Temp\long dir name\ .bat c:\Temp\LONGDI~1\test.bat \Temp\LONGDI~1\
Et si un paramètre est passé dans votre script comme dans
essai c:\temp\mysrc\test.cpp
les mêmes manipulations peuvent être faites avec la variable %1.
Mais le résultat de l'expansion de l' %0 dépend de l'emplacement!
Au "niveau supérieur" du lot, il s'étend au nom de fichier de lot courant.
Dans une fonction (call), il s'étend au nom de la fonction.
@echo off
echo %0
call :test
goto :eof
:test
echo %0
echo %~0
echo %~n0
La sortie est (le fichier batch est démarré avec myBatch.chauve-souris )
myBatch.bat
:test
:test
myBatch
en utilisant CALL, EXIT /B, SETLOCAL & ENDLOCAL vous pouvez implémenter des sous-programmes avec des variables locales.
exemple:
@echo off
set x=xxxxx
call :sub 10
echo %x%
exit /b
:sub
setlocal
set /a x=%1 + 1
echo %x%
endlocal
exit /b
ce sera imprimé
11
xxxxx
même si: sub modifie X.
astuce sournoise pour attendre N secondes (ne fait pas partie du cmd.exe, mais n'est-ce pas de logiciel supplémentaire, car il est livré avec Windows), voir le ping ligne. Vous avez besoin de n+1 pings puisque le premier ping sort sans délai.
echo %time%
call :waitfor 5
echo %time%
goto :eof
:waitfor
setlocal
set /a "t = %1 + 1"
>nul ping 127.0.0.1 -n %t%
endlocal
goto :eof
capable d'exécuter des commandes et de traiter la sortie (comme des backticks de '$()' en bash).
for /f %i in ('dir /on /b *.jpg') do echo --^> %i
s'il y a des espaces dans les noms de fichiers, Utilisez ceci:
for /f "tokens=*" %i in ('dir /on /b *.jpg') do echo --^> %i
pour masquer toute la sortie d'une commande rediriger vers >nul 2>&1.
par exemple, certains programmes en ligne de commande affichent la sortie même si vous redirigez vers >nul. Mais, si vous redirigez la sortie comme la ligne ci-dessous, la sortie sera supprimé.
PSKILL NOTEPAD >nul 2>&1
EDIT: Voir en Ignorant la sortie d'une commande pour une explication de comment cela fonctionne.
PAUSE
Arrête l'exécution et affiche l'invite suivante:
Press any key to continue . . .
Utile si vous souhaitez exécuter un lot en double-cliquant dessus dans l'Explorateur Windows et veulent réellement voir la sortie plutôt que juste un flash de la fenêtre de commande.
l'équivalent du bash (et d'autres coquilles)
echo -n Hello # or
echo Hello\c
qui sort " Hello
" sans une nouvelle ligne arrière. Un cmd hack pour ce faire:
<nul set /p any-variable-name=Hello
set /p
est une façon d'inviter l'utilisateur à entrer. Il émet la chaîne donnée et attend ensuite, (sur la même ligne, c.-à-d. pas de CRLF), que l'utilisateur tape une réponse.
<nul
pipes simplement une réponse vide à la commande set /p
, de sorte que le le résultat net est la chaîne de prompt émise. (La variable utilisée reste inchangée en raison de la réponse vide.)
les problèmes sont les suivants: il n'est pas possible de sortir un signe d'égalité en tête, et sur Vista les caractères blancs en tête sont supprimés, mais pas sur XP.
rechercher et remplacer lors de la définition des variables d'environnement:
> @set fname=%date:/=%
...supprime le " / " d'une date à utiliser dans les noms de fichiers horodatés.
et les substrats aussi...
> @set dayofweek=%fname:~0,3%
séparateurs de commande:
cls & dir
copy a b && echo Success
copy a b || echo Failure
à la 2e ligne, la commande after && ne s'exécute que si la première commande est réussie.
à la 3e ligne, la commande après || ne s'exécute que si la première commande a échoué.
vous pouvez enchaîner si des déclarations pour obtenir un effet comme un booléen court-circuitant `et'.
if foo if bar baz
pour convertir rapidement un fichier texte Unicode (16bit/char) en un fichier DOS ASCII (8bit/char).
C:\> type unicodeencoded.txt > dosencoded.txt
en bonus, si possible, les caractères sont correctement mappés.
si structure de bloc:
if "%VS90COMNTOOLS%"=="" (
echo: Visual Studio 2008 is not installed
exit /b
)
expansion retardée des variables (avec soustractions pour bonne mesure):
@echo off
setlocal enableextensions enabledelayedexpansion
set full=/u01/users/pax
:loop1
if not "!full:~-1!" == "/" (
set full2=!full:~-1!!full2!
set full=!full:~,-1!
goto :loop1
)
echo !full!
endlocal
ne fournit pas beaucoup de fonctionnalités, mais vous pouvez utiliser la commande title pour quelques utilisations, comme fournir le statut sur un long script dans la barre de tâches, ou tout simplement pour améliorer les commentaires des utilisateurs.
@title Searching for ...
:: processing search
@title preparing search results
:: data processing
vous n'avez pas d'éditeur sous la main et vous avez besoin de créer un fichier batch?
copy con test.bat
tapez simplement les commandes, appuyez sur Entrée pour obtenir une nouvelle ligne. Appuyez sur Ctrl-Z et entrez pour fermer le fichier.
exemple de chaîne de soustraction sur date
et time
pour obtenir le fichier nommé "AAAA-MM-JJ HH:MM:SS.txt "
echo test > "%date:~0,4%-%date:~5,2%-%date:~8,2% %time:~0,2%_%time:~3,2%_%time:~6,2%.txt"
j'utilise color
pour indiquer si mon script se termine avec succès, a échoué, ou a besoin d'une entrée en changeant la couleur du texte et de l'arrière-plan. Cela aide vraiment quand vous avez une machine à portée de vue mais assez loin
couleur XY
où X et Y est la valeur hexadécimale de 0
à F
, où X - background, Y - text, où X = Y la couleur ne changera pas.
"151960920 de couleur" Z
change la couleur du texte en 'Z' et définit le fond noir, 'la couleur 0' ne fonctionnera pas
pour les noms de couleurs appeler
de couleur ?
contrôle Total sur la sortie avec de l'espace et les caractères d'échappement.:
echo. ^<resourceDir^>/%basedir%/resources^</resourceDir^>
TheSoftwareJedi déjà mentionné le pour commande, mais je vais le mentionner à nouveau car il est très puissant.
les sorties suivantes la date courante dans le format AAAAMMJJ, Je l'utilise lors de la génération de répertoires pour les sauvegardes.
for /f "tokens=2-4 delims=/- " %a in ('DATE/T') do echo %c%b%a