Quelles sont certaines des fonctionnalités les moins connues, mais importantes et utiles des fichiers de commandes Windows?
Des lignes directrices:
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? )
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
PUSHD path
Vous amène au répertoire spécifié par chemin.
POPD
Vous ramène au répertoire que vous avez "poussé".
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.
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
Sous-chaînes variables:
> set str=0123456789
> echo %str:~0,5%
01234
> echo %str:~-5,5%
56789
> echo %str:~3,-3%
3456
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.
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.
Le chemin (avec lecteur) où se trouve le script: ~ dp0
set BAT_HOME=%~dp0
echo %BAT_HOME%
cd %BAT_HOME%
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
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.
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
Échapper à la "plomberie":
echo ^| ^< ^> ^& ^\ ^^
Ê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
Créer un fichier vide:
> copy nul filename.ext
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.
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.
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.
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%
Calcul arithmétique entier:
> SET /A result=10/3 + 1
4
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é.
Vous pouvez chaîner les instructions if pour obtenir un effet similaire à un booléen court-circuitant `and '.
if foo if bar baz
Sortir une ligne vide:
echo.
si structure en bloc:
if "%VS90COMNTOOLS%"=="" (
echo: Visual Studio 2008 is not installed
exit /b
)
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.
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
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
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.
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 ?
Contrôle total de la sortie avec espacement et caractères d'échappement .:
echo. ^<resourceDir^>/%basedir%/resources^</resourceDir^>
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
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
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:\>
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)
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.
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.
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.
(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!
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
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
L'option de sous-répertoire sur 'remove directory':
rd /s /q junk
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.
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 ...
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.
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%
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
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 .
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.
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
)
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%
/ 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 + r, cmd REVENIR, ping google.com REVENIR
mais maintenant je fais juste:
gagner + r, cmd/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.
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"
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 .
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>
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.
Findstr avec le support de l'expression régulière:
findstr "^[0-9].*" c:\windows\system32\drivers\etc\hosts
Recherchez des chaînes dans des fichiers d'un dossier à l'aide du tube '|' commander:
dir /b *.* | findstr /f:/ "thepattern"
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.
Répertoriez tous les lecteurs:
fsutil fsinfo drives
Définition de variables d'environnement à partir d'un fichier avec SET /P
SET /P SVNVERSION=<ver.tmp
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)
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!
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
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.)
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
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
Cautionnement en cas d'erreur.
IF "%errorlevel%" NEQ "0" (
echo "ERROR: Something broke. Bailing out."
exit /B 1
)
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.
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
Une méthode pour définir le niveau d'erreur sur le nombre souhaité:
Numéro de sortie CMD/C
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
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 ...
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.
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.
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 *").
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.
Pour les boucles avec des compteurs numériques (sorties 1 à 10):
for /l %i in (1,1,10) do echo %i
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é.
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
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
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 :)
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.
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.
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.
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.
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.
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
Une très vieille astuce (environ 1990) pour obtenir la taille totale des variables d'environnement:
set > test
dir test
del test
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.
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.