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? )

232
demandé sur Chris Noe 2008-10-29 03:34:22

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
185
répondu Chris Noe 2010-08-07 18:00:54
PUSHD path

vous amène au répertoire spécifié par chemin .

POPD

vous ramène au répertoire d'où vous avez" poussé".

150
répondu raven 2011-04-06 12:49:38

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.

109
répondu LeopardSkinPillBoxHat 2008-10-29 02:54:07

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
87
répondu Chris Noe 2008-10-29 00:35:13

substrats variables:

> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
79
répondu Chris Noe 2008-10-29 00:41:33

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...

72
répondu TheSoftwareJedi 2008-10-29 00:57:21

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.

60
répondu Patrick Cuff 2008-11-03 20:41:04

le chemin (avec le lecteur) où le script est : ~dp0

set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%
54
répondu RealHowTo 2008-10-29 00:39:01

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
49
répondu 3 revs, 2 users 75%Hartmut 2011-03-17 12:25:56

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.

43
répondu Ferruccio 2008-10-29 04:21:57

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
42
répondu paxdiablo 2008-10-29 01:09:02

échapper à la "plomberie":

echo ^| ^< ^> ^& ^\ ^^
37
répondu Chris Noe 2008-10-31 16:45:47

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
31
répondu paxdiablo 2010-08-07 18:27:05

création d'un fichier vide:

> copy nul filename.ext
30
répondu nzpcmad 2009-07-03 16:33:15

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.

28
répondu aphoria 2008-12-02 18:31:39
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.

25
répondu raven 2009-11-30 14:50:36

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.

25
répondu paxdiablo 2010-11-06 00:21:35

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%
18
répondu SqlACID 2009-07-03 16:37:08

arithmétique entière:

> SET /A result=10/3 + 1
4
17
répondu Chris Noe 2008-10-29 00:44:28

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é.

16
répondu doekman 2009-09-10 20:33:40

sortie d'une ligne vierge:

echo.
15
répondu paxdiablo 2008-10-29 01:30:33

vous pouvez enchaîner si des déclarations pour obtenir un effet comme un booléen court-circuitant `et'.

if foo if bar baz
15
répondu Jack 2008-10-31 01:55:01

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.

14
répondu RealHowTo 2008-10-29 02:48:32

si structure de bloc:

if "%VS90COMNTOOLS%"=="" (
  echo: Visual Studio 2008 is not installed
  exit /b
)
14
répondu Ferruccio 2008-10-29 04:13:57

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
12
répondu paxdiablo 2008-10-29 00:56:02

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
12
répondu Hartmut 2008-11-04 20:14:07

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.

11
répondu Hartmut 2009-02-11 00:09:15

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 ?

11
répondu MoreThanChaos 2009-08-28 05:41:12

contrôle Total sur la sortie avec de l'espace et les caractères d'échappement.:

echo.    ^<resourceDir^>/%basedir%/resources^</resourceDir^>
10
répondu paxdiablo 2011-03-24 17:06:26

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
9
répondu remonedo 2009-07-03 16:35:39