web-dev-qa-db-fra.com

Fonctionnalités cachées des fichiers de commandes Windows

Quelles sont certaines des fonctionnalités les moins connues, mais importantes et utiles des fichiers de commandes Windows?

Des lignes directrices:

  • Une fonctionnalité par réponse
  • Donnez à la fois une brève description de la fonction et un exemple , pas seulement un lien vers la documentation
  • Limitez les réponses aux fonctionnalités natives , c’est-à-dire qu’elles ne nécessitent pas de logiciel supplémentaire, comme le Kit de ressources Windows .

Précision: nous nous référons ici aux scripts traités par cmd.exe, qui est la valeur par défaut pour les variantes WinNT.

(Voir aussi: Fichiers de commandes Windows: .bat vs .cmd? )

232
Chris Noe

Continuation de 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
Chris Noe
PUSHD path

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

POPD

Vous ramène au répertoire que vous avez "poussé".

150
raven

Vous ne savez pas à quel point cela peut être utile dans un fichier batch, mais c'est une commande très pratique à utiliser dans la commande Invite:

C:\some_directory> start .

Cela ouvrira l'explorateur Windows dans le dossier "répertoire_quelque".

J'ai trouvé cela un bon gain de temps.

109

J'ai toujours eu du mal à lire les commentaires qui sont marqués par un mot clé sur chaque ligne:

REM blah blah blah

Plus facile à lire:

:: blah blah blah
87
Chris Noe

Sous-chaînes variables:

> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
79
Chris Noe

La commande FOR ! Bien que je déteste écrire des fichiers batch, je suis reconnaissant pour cela.

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

analyserait chaque ligne dans myfile.txt, en ignorant les lignes commençant par un point-virgule, en passant les 2ème et 3ème jetons de chaque ligne au corps for, avec des jetons délimités par des virgules et/ou des espaces. Notez que les instructions for body font 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.

Vous pouvez également l'utiliser pour parcourir des répertoires, leur contenu, etc.

72
TheSoftwareJedi

Plutôt que d'écraser 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 que vous pouvez utiliser les caractères de canal et de redirection sans les échapper.

60
Patrick Cuff

Le chemin (avec lecteur) où se trouve le script: ~ dp0

set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%
54
RealHowTo

La partie% ~ dp0 a déjà été mentionnée, mais il y a bien plus que cela: le ou les caractères après la ~ définissent les informations extraites.
Aucune lettre n'entraîne le retour du nom du fichier de correctif
d - renvoie la lettre de lecteur
p - renvoie le chemin
s - renvoie le chemin court
x - renvoie l'extension de fichier
Donc, si vous exécutez le script test.bat ci-dessous à partir du dossier c:\Temp\nom de répertoire long \,

@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
test c:\temp\mysrc\test.cpp
Les mêmes manipulations peuvent être effectuées avec la variable% 1.

Mais le résultat de l'expansion de% 0 dépend de l'emplacement!
Au "niveau supérieur" du lot, il se développe au nom de fichier du lot actuel.
Dans une fonction (appel), le nom de la fonction s’agrandit.

@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.bat)

myBatch.bat
:test
:test
myBatch
49
Hartmut

En utilisant CALL, EXIT/B, SETLOCAL & ENDLOCAL, vous pouvez implémenter des sous-routines 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

Cela va imprimer

11
xxxxx

même si: sub modifie x.

43
Ferruccio

Astuce sournoise pour attendre N secondes (ne faisant pas partie de cmd.exe mais ne constituant pas un logiciel supplémentaire car fourni avec Windows), voir la ligne de ping. Vous avez besoin de N + 1 pings car le premier ping s'éteint 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
paxdiablo

Échapper à la "plomberie":

echo ^| ^< ^> ^& ^\ ^^
37
Chris Noe

Être capable d'exécuter des commandes et de traiter la sortie (comme des backticks de '$ ()' dans 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
paxdiablo

Créer un fichier vide:

> copy nul filename.ext
30
nzpcmad

Pour masquer toutes les sorties 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, toute la sortie sera supprimée.

PSKILL NOTEPAD >nul 2>&1

EDIT: Voir Ignorer le résultat d’une commande pour une explication de la procédure.

28
aphoria

L'équivalent de la bash (et autres coquillages)

echo -n Hello # or
echo Hello\\c

qui produit "Hello" sans nouvelle ligne. Un hack de cmd pour faire ceci:

<nul set /p any-variable-name=Hello

set /p est un moyen d'inviter l'utilisateur à entrer. Il émet la chaîne donnée et attend ensuite (sur la même ligne, c’est-à-dire sans CRLF), que l’utilisateur saisisse une réponse.

<nul dirige simplement une réponse vide à la commande set /p, de sorte que le résultat net correspond à la chaîne d'invite é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 générer un signe égal égal, et sous Vista, les caractères d'espacement en blanc sont supprimés, mais pas sous XP.

25
paxdiablo
PAUSE

Arrête l'exécution et affiche l'invite suivante:

Appuyez sur n'importe quelle touche pour continuer . . .

Utile si vous souhaitez exécuter un lot en double-cliquant dessus dans l'Explorateur Windows et que vous souhaitez réellement voir le résultat plutôt qu'un simple éclair de la fenêtre de commande.

25
raven

Rechercher et remplacer lors de la définition de variables d'environnement:

> @set fname=%date:/=%

... supprime le "/" d'une date pour l'utiliser dans les noms de fichiers horodatés.

et des sous-chaînes aussi ...

> @set dayofweek=%fname:~0,3%
18
SqlACID

Calcul arithmétique entier:

> SET /A result=10/3 + 1
4
17
Chris Noe

Séparateurs de commandes:

cls & dir
copy a b && echo Success
copy a b || echo Failure

Sur la deuxième ligne, la commande après && ne s'exécute que si la première commande a abouti.

A la 3ème ligne, la commande après || ne fonctionne que si la première commande a échoué.

16
doekman

Vous pouvez chaîner les instructions if pour obtenir un effet similaire à un booléen court-circuitant `and '.

if foo if bar baz
15
Jack

Sortir une ligne vide:

echo.
15
paxdiablo

si structure en bloc:

if "%VS90COMNTOOLS%"=="" (
  echo: Visual Studio 2008 is not installed
  exit /b
)
14
Ferruccio

Pour convertir rapidement un fichier texte Unicode (16 bits/caractère) en un fichier ASCII DOS (8 bits/caractère).

C:\> type unicodeencoded.txt > dosencoded.txt

en bonus, si possible, les personnages sont correctement mappés.

14
RealHowTo

Ne fournit pas beaucoup de fonctionnalités, mais vous pouvez utiliser la commande title pour plusieurs utilisations, comme fournir l’état d’un long script dans la barre des tâches, ou tout simplement pour améliorer les commentaires des utilisateurs.

@title Searching for ...
:: processing search
@title preparing search results
:: data processing
12
Hartmut

Expansion retardée des variables (avec sous-chaînes ajoutées pour une 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
paxdiablo

Vous n'avez pas d'éditeur et vous devez créer un fichier de commandes?

copy con test.bat

Il suffit de taper les commandes, appuyez sur Entrée pour une nouvelle ligne. Appuyez sur Ctrl-Z et Entrée pour fermer le fichier.

11
Hartmut

exemple de soustraction de chaîne 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 aboutit, a échoué ou nécessite une entrée en modifiant la couleur du texte et de l'arrière-plan. Cela aide vraiment lorsque vous avez une machine à portée de vue mais assez éloignée

couleur XY

où X et Y sont une valeur hexadécimale de 0 à F, où X - arrière plan, Y - texte, lorsque X = Y couleur ne changera pas.

couleur Z

change la couleur du texte en 'Z' et définit un fond noir, la 'couleur 0' ne fonctionnera pas

pour les noms de couleurs appelez

couleur ?

11
MoreThanChaos

Contrôle total de la sortie avec espacement et caractères d'échappement .:

echo.    ^<resourceDir^>/%basedir%/resources^</resourceDir^>
10
paxdiablo

TheSoftwareJedi a déjà mentionné la commande for, mais je vais la mentionner car elle est très puissante.

Ce qui suit affiche la date du jour au format AAAAMMJJ. J'utilise cela 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
remonedo

Vous pouvez utiliser call pour évaluer les noms ultérieurement, ce qui conduit à des propriétés utiles.

call set SomeEnvVariable_%extension%=%%%somevalue%%%

Utiliser call pour définir des variables dont le nom dépend d'autres variables. Si utilisé avec certaines règles de nommage de variables, vous pouvez émuler des collections de données telles que des tableaux ou des dictionnaires en utilisant des règles de nommage soigneuses. Les triples%% autour de la valeur sont donc ils seront évalués à un nom de variable entouré par des% uniques après l'appel et avant que l'ensemble soit appelé. Cela signifie que deux% dans une rangée s'échappent en un seul caractère%, puis le développera à nouveau, ainsi une valeur est en réalité un pointeur de nom.

call set TempVar=%%SomeEnvVariable_%extension%%%

Son utilisation avec une variable temp pour récupérer la valeur, que vous pouvez ensuite utiliser en logique. Ceci est particulièrement utile lorsqu’il est utilisé avec une expansion de variable retardée.

Pour utiliser cette méthode correctement, l’expansion de variable différée doit être activée. Comme il est désactivé par défaut, il est préférable de l'activer dans le script en l'insérant dans l'une des premières instructions:

setlocal EnableDelayedExpansion
8
Lara Dougan

Rechercher un exécutable sur le chemin (ou une autre chaîne semblable à un chemin si nécessaire):

c:\> for %i in (cmd.exe) do @echo. %~$PATH:i
C:\WINDOWS\system32\cmd.exe

c:\> for %i in (python.exe) do @echo. %~$PATH:i
C:\Python25\python.exe

c:\>
7
paxdiablo

En ce qui concerne l'utilisation de :: au lieu de REM pour les commentaires: soyez prudent! :: est un cas particulier d'étiquette CALL qui agit comme un commentaire. Lorsqu'elle est utilisée entre crochets, par exemple dans une boucle FOR ou IF, la fonction se ferme prématurément. Très frustrant de déboguer!

Voir http://www.ss64.com/nt/rem.html pour une description complète.

(en ajoutant une nouvelle réponse à la place d'un commentaire au première mention de ce qui précède car je ne vaux pas encore de commeting: 0)

7
matt wilkie

Les variables locales sont toujours analysées pour la ligne utilisée par ENDLOCAL. Cela permet des astuces telles que:

ENDLOCAL & SET MYGLOBAL=%SOMELOCAL% & SET MYOTHERGLOBAL=%SOMEOTHERLOCAL%

C'est un moyen utile de transmettre les résultats au contexte appelant. Plus précisément,% SOMELOCAL% sort de la portée dès qu'ENDLOCAL est terminé, mais à ce moment-là,% SOMELOCAL% est déjà développé, de sorte que MYGLOBAL est affectée dans le contexte d'appel avec la variable locale.

Pour la même raison, si vous décidez de le faire:

ENDLOCAL & SET MYLOCAL=%MYLOCAL%

Vous découvrirez que votre nouvelle variable MYLOCAL est en fait maintenant une variable d’environnement normale au lieu de la variable localisée que vous aviez peut-être voulu.

6
Coding With Style

Beaucoup de gens utilisent GOTO: EOF ces jours-ci pour terminer leurs fichiers de commandes, mais vous pouvez aussi utiliser EXIT/B à cette fin.

L’utilisation de EXIT/B présente l’avantage de pouvoir ajouter un niveau d’erreur après EXIT/B, qui se terminera avec ce niveau d’erreur.

6
Coding With Style

Le mode d'édition rapide dans cmd.exe est mon préféré. Ceci est légèrement hors sujet, mais lors de l'interaction avec la commande Shell, cela peut vous sauver la vie. Non, je ne suis pas hyperbolique - vous ne verrez que caret-capitol-v un certain nombre de fois avant de mourir; plus vous en voyez, plus vite vous mourrez.

  1. Ouvrez regedit (attention, pas de ma faute, écran bleu, etc.)
  2. Allez à HKCU/Console
  3. Définissez QuickEdit sur 1

(Vous pouvez également définir ceci à partir de l'interface utilisateur, ce qui est probablement le meilleur moyen. Consultez les commentaires pour obtenir des instructions. Il existe également un joli script à une ligne pour le faire également.)

Maintenant, pour copier, il suffit de faire un clic gauche et de faire glisser pour sélectionner et cliquer avec le bouton droit pour copier. Pour coller, faites un clic droit.

NON PLUS ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V ^ V !!!

Merde, je pense que je viens de tuer quelqu'un. Pardon!

5
Will

Ensemble d'appels - Agrandit les variables d'environnement de plusieurs niveaux.

Trouvé ceci à http://ss64.com/nt/call.html#advanced de la réponse à une autre SO question Variables de fichier batch initialisées dans une boucle for

set VarName=Param
set Param=This

call set Answer=%%%Varname%%%
Echo %Answer%

donne

set VarName=Param
set Param=This
call set Answer=%Param%
Echo This
This
5
Andy Morris

Sous-programmes (sorties 42):

    @echo off
    call :answer 42
    goto :eof
:do_something
    echo %1
    goto :eof

et sous-routines renvoyant une valeur (sorties 0, 1, 2, etc.):

    @echo off
    setlocal enableextensions enabledelayedexpansion
    call :seq_init seq1
:loop1
    if not %seq1%== 10 (
        call :seq_next seq1
        echo !seq1!
        goto :loop1
    )
    endlocal
    goto :eof

:seq_init
    set /a "%1 = -1"
    goto :eof
:seq_next
    set /a "seq_next_tmp1 = %1"
    set /a "%1 = %seq_next_tmp1% + 1"
    set seq_next_tmp1=
    goto :eof
5
paxdiablo

L'option de sous-répertoire sur 'remove directory':

rd /s /q junk
4
paxdiablo

Rediriger la sortie vers la console, même si la sortie du lot est déjà redirigée vers un fichier via la syntaxe > con.

Exemple: foo.cmd:

echo a
echo b > con

Appel:

foo.cmd > output.txt

Ceci aura pour résultat que "a" ira à output.txt encore "b" à aller à la console.

4
NicJ
SHIFT

C'est un moyen de parcourir un nombre variable d'arguments passés dans un script (ou une sous-routine) sur la ligne de commande. Dans son utilisation la plus simple, il fait passer% 2 à% 1,% 3 à% 2, etc. (Vous pouvez également passer un paramètre à SHIFT pour ignorer plusieurs arguments.) Cela rend la commande "destructive" (c'est-à-dire que% 1 disparaît définitivement), mais vous permet d'éviter de coder en dur un nombre maximal d'arguments pris en charge.

Voici un court exemple pour traiter les arguments de ligne de commande un par un:

:ParseArgs

if "%1"=="" (
    goto :DoneParsingArgs
)

rem ... do something with %1 ...

shift

goto :ParseArgs


:DoneParsingArgs

rem ...
4
reuben

Vous pouvez utiliser errorlevel pour vérifier si un programme donné est disponible sur le système (répertoire ou chemin actuel) où votre fichier batch sera exécuté. Pour que cela fonctionne, le programme que vous testez doit être exécuté, quitter et définir un code de sortie. Dans l'exemple que j'utilise -? En tant qu'argument de myExe, la plupart des programmes CLI ont un argument similaire, tel que -h, --help, -v, etc.

myExe -? >nul 2>&1 
Set errCode=%errorlevel%
@if %errCode% EQU 0 (
    echo myExe -? does not return an error (exists)
) ELSE (
    echo myExe -? returns an error (does not exist)
)

Oui, vous pouvez tester errorlevel directement plutôt que de l'attribuer à errCode, mais vous pouvez ainsi avoir des commandes entre le test et la condition et vous testez la condition à plusieurs reprises, si nécessaire.

4
batch fool

Obtenir le jour, le mois et l'année en cours (indépendamment du lieu):

for /f "tokens=1-4 delims=/-. " %%i in ('date /t') do (call :set_date %%i %%j %%k %%l)
goto :end_set_date

:set_date
if ("%1:~0,1%" gtr "9") shift
for /f "skip=1 tokens=2-4 delims=(-)" %%m in ('echo,^|date') do (set %%m=%1&set %%n=%2&set %%o=%3)
goto :eof

:end_set_date

echo day in 'DD' format is %dd%; month in 'MM' format is %mm%; year in 'YYYY' format is %yy%
3
Andrei Coșcodan

le format correct pour les boucles avec des variables numériques est

for /l %%i in (startNumber, counter, endNumber) do echo %%i

plus de détails> http://www.ss64.com/nt/for.html

3
Alin Sfetcu

La commande CHOICE invite l'utilisateur à choisir l'une des nombreuses options (via une seule pression de touche).

@echo off
echo Please choose one of the following options
echo 1. Apple
echo 2. Orange
echo 3. Pizza
echo a, b, c. Something else
choice /c:123abc /m "Answer?"
set ChoiceLevel=%ErrorLevel%
echo Choice was: %ChoiceLevel%

%ChoiceLevel% sera la nième option sélectionnée (dans l'exemple ci-dessus, b=5).

Plus de détails à la page de référence CHOICE sur SS64.com .

3
NicJ

Un truc pratique lorsque vous souhaitez copier des fichiers entre des branches:

C:\src\branch1\mydir\mydir2\mydir3\mydir4>xcopy %cd:branch1=branch2%\foo*
Overwrite C:\src\branch1\mydir\mydir2\mydir3\mydir4\foo.txt (Yes/No/All)? y
C:\src\branch2\mydir\mydir2\mydir3\mydir4\foo.txt

Ceci utilise à la fois la variable d'environnement% cd% et la substitution de variable d'environnement.

3
Igor Dvorkin

Pour analyser stdin depuis un script, vous avez besoin de cette astuce avec les commandes FOR et FIND:

for /f "tokens=*" %%g in ('find /V ""') do (
     :: do what you want with %%g
     echo %%g
)
3

Tableaux dans des fichiers de commandes.

Définir une valeur:

set count=1
set var%count%=42

Extrayez une valeur en ligne de commande:

call echo %var%count%%

Extraire une valeur dans un fichier de commandes:

call echo %%var%count%%%

Notez les signes de% supplémentaires.

La technique peut sembler un peu velue, mais elle est très utile. Ce qui précède imprimera le contenu de var1 (c'est-à-dire 42) comme nous l'avons expliqué. Nous pourrions également remplacer la commande echo par un set si nous voulions définir une autre variable avec la valeur entre var1 . Ce qui suit est une affectation valide sur la ligne de commande:

call set x=%var%count%%

Ensuite, pour voir la valeur de va1 :

echo %x%
2
Ben Burnett

/ c param pour le cmd.exe lui-même, lui dit de s’exécuter puis de faire ces commandes.

Je me trouvais souvent en train de faire:

gagner + rcmd REVENIR, ping google.com REVENIR

mais maintenant je fais juste:

gagner + rcmd/c ping google.com REVENIR

plus vite. également utile si vous utilisez pstools et que vous voulez utiliser psexec pour effectuer une fonction de ligne de commande sur la machine distante.

MODIFIER:/ k Fonctionne de la même manière, mais laisse l'invite ouverte. Cela pourrait être utile plus souvent.

2
Dean Rather

forfiles est très utile, par exemple, pour supprimer récursivement tous les fichiers de plus de deux jours

forfiles /D -2 /P "C:\Temp" /S /C "cmd /c del @path"
2
Brecht Yperman

Pour ce que cela vaut, this est une très bonne référence en ligne pour les fichiers CMD ou batch de Windows. J'ai appris quelques choses que je ne savais pas.

Macros Doskey.

J'ai longtemps perdu la référence pour cela, mais je pense toujours que c'est une bonne idée et qu'elle mérite d'être partagée.

Nous pouvons fusionner des fichiers de commandes et des scripts doskey dans un seul fichier. Cela peut sembler un peu trop intelligent, mais cela fonctionne.

;= @echo off
;= rem Call DOSKEY and use this file as the macrofile
;= %SystemRoot%\system32\doskey /listsize=1000 /macrofile=%0%
;= rem In batch mode, jump to the end of the file
;= goto end

;= Doskey aliases
h=doskey /history

;= File listing enhancements
ls=dir /x $*

;= Directory navigation
up=cd ..
pd=pushd

;= :end
;= rem ******************************************************************
;= rem * EOF - Don't remove the following line.  It clears out the ';' 
;= rem * macro. Were using it because there is no support for comments
;= rem * in a DOSKEY macro file.
;= rem ******************************************************************
;=

Cela fonctionne en définissant une fausse macro doskey ';' qui est ignoré gracieusement (ou silencieusement) lorsqu'il est interprété comme un fichier de commandes.

J'ai raccourci la version listée ici, si vous voulez plus, allez ici .

2
Ben Burnett

L'utilisation de pushd sur un chemin UNC créera un mappage de lecteur temporaire (en commençant par Z et en remontant pour trouver la lettre suivante disponible) et vous placera dans ce lecteur et ce chemin. Lorsque vous ouvrez ou quittez la commande Invite, le mappage temporaire a disparu.

   C:\>pushd \\yourmom\jukebox

   Z:\>pushd \\yourmom\business

   Y:\>

En outre, il ne s'agit pas d'une astuce batch, mais d'une astuce d'environnement de ligne de commande, mais lorsque vous travaillez en ligne de commande avec les partages pushd et popd et les partages réseau, il est utile de modifier votre invite avec la valeur $ + (profondeur de la pile show pushd) et $ M (affiche le chemin de partage réseau).

   C:\utils>Prompt $+$m$p$g

   C:\utils>pushd m:

   +\\yourmom\pub M:\>pushd c:\

   ++c:\>pushd
   M:\
   C:\utils  

   ++c:\>popd

   +\\yourmom\pub M:\>popd

   C:\utils>
2
thatbrentguy

Je trouve la facilité avec laquelle vous pouvez rediriger la sortie des commandes vers des fichiers extrêmement utile:

DIR *.txt > tmp.txt
DIR *.exe >> tmp.txt

Une seule flèche crée ou écrase le fichier, une double flèche y est ajoutée. Maintenant, je peux ouvrir tmp.txt dans mon éditeur de texte et faire toutes sortes de bonnes choses.

2
raven

Findstr avec le support de l'expression régulière:

findstr "^[0-9].*" c:\windows\system32\drivers\etc\hosts
2
BartekB

Recherchez des chaînes dans des fichiers d'un dossier à l'aide du tube '|' commander:

dir /b *.* | findstr /f:/ "thepattern"
2
Frans Bouma

Commentaires en ligne utilisant &::.

:: This is my batch file which does stuff.
copy thisstuff thatstuff  &:: We need to make a backup in case we screw up!

:: ... do lots of other stuff

Comment cela marche-t-il? C'est un bidule laid. Le & est le séparateur de commande se rapprochant approximativement du ; des shells UNIX. Le :: est un autre hack moche qui émule un peu une sorte d’instruction REM. Le résultat final est que vous exécutez votre commande, puis vous exécutez une commande ne rien faire, approximant ainsi un commentaire.

Cela ne fonctionne pas dans toutes les situations, mais cela fonctionne assez souvent pour être un hack utile.

2

Répertoriez tous les lecteurs:

fsutil fsinfo drives
1
Andrei Coșcodan

Définition de variables d'environnement à partir d'un fichier avec SET /P

SET /P SVNVERSION=<ver.tmp
1
Anton Tykhyy

Vous permet de changer de répertoire en fonction d'une variable d'environnement sans avoir à spécifier la directive '%'. Si la variable spécifiée n'existe pas, essayez le nom du répertoire.

@if defined %1 (call cd "%%%1%%") else (call cd %1)
1
Paul Hobbs

Ajouter des fichiers en utilisant une copie:

copy file1.txt+file2.txt+file3.txt append.txt

De plus, pour définir tous les paramètres CLI sur une seule variable:

SET MSG=%*

Cela prend chaque mot (ou symbole) séparé par des espaces et l'enregistre dans une seule variable de fichier de commandes. Techniquement, chaque paramètre est% 1,% 2, $ 3, etc., mais cette commande SET utilise un caractère générique pour référencer chaque paramètre dans stdin.

Fichier de lot:

@SET MSG=%*
@echo %MSG%

Ligne de commande:

C:\test>test.bat Hello World!
Hello World!
1
DaWolfman

Créer et commencer à éditer un nouveau fichier

copy con new.txt
This is the contents of my file
^Z

Ctrl + Z envoie le caractère ASCII EOF. C'est comme heredocs en bash:

cat <<EOF > new.txt
This is the contents of my file
EOF
1
dave1010

Liens symboliques:

mklink /d directorylink ..\realdirectory
mklink filelink realfile

La commande est native sur Windows Server 2008 et versions ultérieures, y compris Vista et Windows 7. (Elle est également incluse dans certains kits de ressources Windows.)

1
Soulman

Rechercher récursivement une chaîne dans une arborescence de répertoires:

findstr /S /C:"string literal" *.*

Vous pouvez également utiliser des expressions régulières:

findstr /S /R "^ERROR" *.log

Recherche de fichier récursive:

dir /S myfile.txt
1
bneal

Le goto: eof pasteboard

J'ajoute "goto: eof" à la fin de mes scripts comme un espace pratique pour les fragments de code. De cette façon, je peux rapidement copier/coller vers et depuis cette zone, sans avoir à commenter/décommenter.

goto :eof
:: code scraps
call this.bat
call that.bat
set TS=%DATE:~10%%DATE:~4,2%%DATE:~7,2%-%TIME:~0,2%%TIME:~3,2%%TIME:~6%%
for /R C:\temp\ %%G in (*.bak) DO del %%G
1
Chris Noe

Cautionnement en cas d'erreur.

IF "%errorlevel%" NEQ "0" (
   echo "ERROR:  Something broke.  Bailing out."
   exit /B 1
)
1
caseyboardman

Tout comme ci-dessus, en utilisant CALL, EXIT/B, SETLOCAL & ENDLOCAL, vous pouvez implémenter des fonctions avec des variables locales et des valeurs de retour.

exemple:

@echo off

set x=xxxxx
call :fun 10
echo "%x%"
echo "%y%"
exit /b

:fun
setlocal
set /a y=%1 + 1
endlocal & set x=%y%
exit /b

Cela va imprimer:

"11"
""

La variable y ne quitte jamais la portée locale, mais en raison de la façon dont CMD résout une ligne à la fois, vous pouvez extraire la valeur dans la variable x de la portée parente.

1
MadKat

Plusieurs commandes sur une ligne, utiles dans de nombreuses situations:

& Utilisé pour combiner deux commandes, exécute commande1 puis commande2
&& Une combinaison conditionnelle, exécute la commande 2 si la commande 1 se termine avec succès
¦¦ Command2 ne s'exécute que si command1 ne se termine pas correctement.

Exemples:

:: ** Edit the most recent .TXT file and exit, useful in a .CMD / .BAT **
FOR /F %%I IN ('DIR *.TXT /B /O:-N') DO NOTEPAD %%I & EXIT


:: ** If exist any .TXT file, display the list in NOTEPAD, if not it 
:: ** exits without any error (note the && and the 2> error redirection)
DIR *.TXT > TXT.LST 2> NUL && NOTEPAD TXT.LST
1
PabloG

Une méthode pour définir le niveau d'erreur sur le nombre souhaité:

Numéro de sortie CMD/C
1
Coding With Style

Masquer l'entrée pour un script de lot interactif:

  @echo off

  echo hP1X500P[PZBBBfh#b##fXf-V@`$fPf]f3/f1/5++u5>in.com

  set /p secret_password="Enter password:"<nul

  for /f "tokens=*" %%i in ('in.com') do (set secret_password=%%i)

  del in.com
1
Andrei Coșcodan

Je dirais que DEBUG.EXE est une fonctionnalité TRÈS utile et TRÈS sous-utilisée des fichiers de commandes.

La commande DEBUG vous permet de ...

  1. Assembler et désassembler du code 16 bits
  2. Mémoire de lecture/écriture (la mémoire protégée moderne la rend beaucoup moins utile.)
  3. Lire des secteurs de données à partir du disque dur, brut
  4. Édition hexadécimale

En bref, cet outil est extrêmement puissant. Il n’est peut-être plus très utile de nos jours, mais le pouvoir d’appeler et de contrôler cette fonctionnalité à partir d’un script de traitement par lots ajoute une puissance incroyable aux scripts de traitement par lots.

REMARQUE: Microsoft a supprimé cette commande des éditions 64 bits de Windows Xp et Vista et a l'intention de la supprimer de Windows 7, de ce que j'ai entendu dire.

1
Coding With Style

Supprimer la citation environnante.

for /f "useback tokens=*" %%a in ('%str%') do set str=%%~a

Je dois récemment écrire un fichier de commandes appelé par l'événement de pré-compilation de VS et je veux passer en paramètre dans le répertoire du projet. Dans le fichier de commandes, je dois concaténer le chemin avec le nom du sous-dossier imbriqué, mais en premier lieu, il faut supprimer la citation environnante.

1
Fadrian Sudaman

Voici comment construire un CLASSPATH en scannant un répertoire donné.

setlocal ENABLEDELAYEDEXPANSION
if defined CLASSPATH (set CLASSPATH=%CLASSPATH%;.) else (set CLASSPATH=.)
FOR /R .\lib %%G IN (*.jar) DO set CLASSPATH=!CLASSPATH!;%%G
Echo The Classpath definition is %CLASSPATH%

fonctionne dans XP (ou mieux). Avec W2K, vous devez utiliser deux fichiers BAT pour obtenir le même résultat (voir Inclure tous les fichiers JAR dans la définition du chemin de classe ).

Ce n'est pas nécessaire pour 1.6 car vous pouvez spécifier un caractère générique directement dans CLASSPATH (ex. -Cp ".\Lib *").

1
RealHowTo
HELP

Lorsque vous travaillez avec différentes versions de système d'exploitation, il est important de savoir quelles commandes sont disponibles en mode natif. En tapant HELP à l'invite de commande, vous verrez quelles commandes sont disponibles, avec une brève description de ce qu'elles font.

cmd.exe /? 

Cette liste répertorie tous les paramètres de ligne de commande permettant de lancer une invite de commande, ainsi que des modifications du registre modifiant le comportement du système.

0
Mark Arnott

Pour les boucles avec des compteurs numériques (sorties 1 à 10):

for /l %i in (1,1,10) do echo %i
0
paxdiablo

Vous pouvez modifier un fichier de commandes pendant son exécution. Par exemple, vous pouvez ajouter un pause oublié à la fin du fichier en cours d'exécution si vous souhaitez voir les résultats avant la fermeture du fichier de commandes.

voir Modification d'un fichier de commandes lors de son exécution

Personnellement, je pense à cela plus comme un piège que comme une fonctionnalité.

0
Mashmagar

Ce fichier de commandes fonctionne les deux avec simple fichiers ainsi que répertoires en tant que paramètres de ligne de commande (vous pouvez les mélanger dans n’importe quel ordre). La boucle exécute la commande ("echo" dans cet exemple) sur n'importe quel fichier spécifié. Si un paramètre est un répertoire, elle exécute la commande de manière récursive sur chacun de ses fichiers.

@echo off
for /f "delims=" %%f in ('dir %* /a-d /b /s') do echo %%f
0
Sascha

Pour obtenir la date/heure actuelle à utiliser pour les fichiers journaux, etc., je l’utilise dans mes fichiers de traitement par lots:

for /f "usebackq tokens=1,2,3,4,5,6,7 delims=/:. " %%a in (`echo %DATE% %TIME%`) do set NOW=%%d%%b%%c_%%e%%f%%g
set LOG=output_%NOW%.log
0
jftuga

La commande IF! Sans cela, mon fichier batch était indésirable!

@echo off
IF exist %windir%\system32\iexplore.exe goto end

echo Hmm... it seems you do not have Internet Explorer.
echo Great! You seem to understand ;)

:end
echo Hmm... You have Internet Explorer.
echo That is bad :)
0
Deniz Zoeteman

FIND en remplacement de grep.
Je me suis piraté un petit "répertoire" avec find. Très utile:

@echo off
:begin
set /p term=Enter query: 
type phonebookfile.txt |find /i "%term%"
if %errorlevel% == 0 GOTO :choose
echo No entry found
set /p new_entry=Add new entry: 
echo %new_entry% >> phonebookfile.txt 
:choose
set /p action=(q)uit, (n)ew query or (e)dit? [q] 
if "%action%"=="n" GOTO anfang
if "%action%"=="e" (
    notepad phonebookfile.txt
    goto :choose
)

Très rapide et efficace.

0
guerda

Exécution en ligne

Bien que ce ne soit pas un avantage évident dans la plupart des cas, il peut être utile d’essayer de mettre à jour des éléments en cours de fonctionnement. Par exemple:

UpdateSource.bat

copy UpdateSource.bat Current.bat
echo "Hi!"

Current.bat

copy UpdateSource.bat Current.bat

Maintenant, l’exécution de Current.bat produit cette sortie.

HI!

Attention si, l'exécution du lot se fait par numéro de ligne. Une mise à jour comme celle-ci risque de sauter ou de reculer d'une ligne si les lignes essentielles ne portent pas exactement les mêmes numéros de ligne.

0
John Fisher

Lorsque vous utilisez des extensions de commande les options du shell dans un script, il est fortement suggéré de suivre l’astuce suivante au début de vos scripts.

- Informations collées depuis http://www.ss64.com/nt/setlocal.html

SETLOCAL définira un ERRORLEVEL si un argument est donné. Ce sera zéro si l'un des deux arguments valides est donné et un sinon.

Vous pouvez l'utiliser dans un fichier de commandes pour déterminer si des extensions de commande sont disponibles, à l'aide de la technique suivante:

VERIFY errors 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo Unable to enable extensions

Cela fonctionne car "VERIFY errors" définit ERRORLEVEL sur 1, puis SETLOCAL ne réinitialisera pas la valeur ERRORLEVEL si les extensions ne sont pas disponibles (par exemple, si le script est exécuté sous command.com).

Si les extensions de commande sont désactivées de manière permanente, SETLOCAL ENABLEEXTENSIONS ne les restaure pas.

0

J'aime beaucoup ceci Commandes Windows XP _ , ainsi que le lien Syntaxe en haut; il couvre bon nombre des trucs et astuces déjà trouvés dans d'autres réponses.

0
leander

Lorsque vous transmettez un nombre inconnu de paramètres à un fichier de commandes, par exemple, lorsque plusieurs fichiers sont glissés et déposés sur le fichier de commandes pour le lancer, vous pouvez faire référence à chaque variable de paramètre par son nom, par exemple,.

TYPE %1
TYPE %2
TYPE %3
TYPE %4
TYPE %5
...etc

mais cela devient très compliqué quand vous voulez vérifier si chaque paramètre existe:

if [%1] NEQ [] (
TYPE %1
)
if [%2] NEQ [] (
TYPE %2
)
if [%3] NEQ [] (
TYPE %3
)
if [%4] NEQ [] (
TYPE %4
)
if [%5] NEQ [] (
TYPE %5
)
...etc

En outre, vous ne pouvez accepter qu'un nombre limité de paramètres avec cette approche.

Au lieu de cela, essayez d'utiliser la commande SHIFT:

:loop
IF [%1] NEQ [] (
TYPE %1
) ELSE (
GOTO end
)
SHIFT
GOTO loop
:end

SHIFT déplacera tous les paramètres de un, ainsi% 2 deviendra% 1 et% 3 deviendra% 2, etc.

0
sahmeepee

Je les utilise comme raccourcis rapides vers les répertoires couramment utilisés. Un exemple de fichier nommé "sandbox.bat" qui réside dans un répertoire de mon chemin

Explorer "C:\Documents and Settings\myusername\Desktop\sandbox"

L'appel du script est simplement WIN + R -> sandbox

0
jon_brockman

Une très vieille astuce (environ 1990) pour obtenir la taille totale des variables d'environnement:

set > test
dir test
del test
0
some

voici une astuce que j'utilise pour exécuter mon script Nant Build consécutivement sans avoir à cliquer sur le fichier de commandes, encore et encore.

:CODELINE
NANT.EXE -buildfile:alltargets.build -l:build.log build.product
@pause
GOTO :CODELINE

Qu'est-ce qui va arriver, c'est qu'après que votre solution a fini de construire, il sera mis en pause. Si vous appuyez sur n’importe quelle touche, le script de génération sera à nouveau exécuté. Très pratique, je dois dire.

0
RWendi

Il y a aussi la commande EDLIN. Bien qu'il s'agisse peut-être d'un vieil outil bâtard utilisé autrefois pour l'édition de texte par ligne, le fait qu'il soit contrôlable à partir de la ligne de commande le rend plutôt utile pour les scripts par lots, principalement parce que, comme dans tout autre cas d'utilisation d'EDLIN, le seul outil disponible. Après tout, EDLIN n’est pas un outil que vous voudriez normalement utiliser pour l’édition de texte, à moins que vous ne soyez un peu masochiste. Tim Patterson (le type qui l'a écrit) a déclaré: "J'étais consterné d'apprendre que IBM l'utilisait et ne le jetait pas par la fenêtre."

REMARQUE: EDLIN ajoute les anciens marqueurs EOF (1A) aux fichiers qu’il édite. Si vous devez les supprimer, vous devrez probablement utiliser DEBUG.

0
Coding With Style