Ah les chemins…
Mais c’est quoi un chemin en fait ?
Il y en a 2 types :
Chemin absolu = il s’agit du chemin complet pour accéder à un fichier ou un dossier.
C:\Scripts\logs\fichier.txtChemin relatif = il s’agit du chemin cours, indiquant ainsi le dossier courant.
logs\fichier.txt.\fichier.txtDans le cadre de l’utilisation d’un script qui s’appelle « test.cmd« , imaginons que celui-ci soit placé dans le répertoire suivant :
C:\John\Scripts\Le chemin absolu de ce script sera alors :
C:\John\Scripts\tets.cmdEt le chemin relatif sera :
Scripts\tets.cmdSoit, le nom du dossier dans lequel il se trouve suivit de « \ » et du nom du script.
Utilisation du chemin absolu
Le chemin absolu s’utilise quand celui-ci est fixe et continu.
Il évite toute ambiguïté si le script, fichiers et répertoires associés ne changent jamais d’emplacement.
Généralement utilisé surtout dans le cas ou le chemin de source ou cible est un dossier système ou partage réseau.
Exemple :
C:\Windows
C:\User\John\Desktop
\\192.168.34.2\Partage_réseau\PhotosExemple d’utilisation dans un script batch (.cmd) :
copy "C:\User\John\Desktop\test.cmd" "C:\Temp\Scripts\"Note : Les guillemets « » servent à encadre un chemin contenant des espaces.
Même si il n’y en a pas, c’est une bonne pratique de les mettre ;-).
Utilisation du chemin relatif
Le chemin relatif s’utilise souvent dans le cadre de l’utilisation d’un script nomade.
Vous partez en vacance et emportez avec vous vos meilleurs scripts dans une clé USB pour épater la galerie !
Le script et dossiers qui l’accompagnent ne sont plus dans votre PC mais dans votre clé.
Le chemin ne sera plus :
C:\Temp\Scripts\text.cmdLe dossier « \Scripts » sera alors à la racine de votre clé ou même dans un autre dossier.
Prenons donc cet exemple et admettons que votre script a pour rôle de copier une image qui se trouve à la racine d’un dossier qui se nome « Script » et que votre script se trouve également dans ce dossier.
\Script\test.cmd\Script\img.pngGraphiquement :
RACINE clé USB \ Script \ img.png
\ test.cmdLe but va être de copier l’image présente dans le répertoire « Script » de la clé USB vers le répertoire « Desktop » des comptes présents sur le poste (le bureau des utilisateurs).
C:\Users\Public\DesktopCe répertoire « img » présent sur la clé pourrait être partagé voir dupliqué et se retrouver sur une autre clé USB.
Dans ce cas, le chemin absolu n’est pas le bon à prendre mais bien le chemin relatif.
Il est alors possible d’imaginer que le script ressemblera à ça :
copy "Script\img.png" "C:\Users\Public\Desktop\"Mais ce script n’est en réalité pas fiable, même si il peut fonctionner.
Dans cet exemple j’ai utilisé un chemin relatif implicite car j’ai donné le nom du répertoire ou se trouvait mon image et mon script à savoir « \Script« .
Mon script fonctionne si il est toujours lancé depuis le même répertoire, mais si je le change il ne fonctionnera plus.
Ce script n’est finalement pas très nomade malgré le fait d’utiliser un chemin relatif.
Améliorons le :
copy ".\img.png" "C:\Users\Public\Desktop\" /YUne explication s’impose !
-> « . » devant « \img.png » signifie « dans le dossier courant ».
-> « /Y » est une option de la commande « copy » qui sert à supprimer la demande de confirmation si le fichier existe déjà lors de l’écrasement.
Allons plus loin !
Chemin semi-absolu
Semi quoi ?
C’est quoi encore ça ?
En fait il existe un 3e type de chemin, hybride très commun en scripting et surtout très fiable.
copy ".\img.png" "%PUBLIC%\Desktop\" /Y-> %PUBLIC% est la bonne pratique car il fonctionne même si Windows est installé ailleurs que sur le « C :\« .
Poussons le bouchon au maximum !
copy "%~dp0img.png" "%PUBLIC%\Desktop\" /Y-> « %~dp0 » = chemin du dossier où se trouve le script (test.cmd).
On a ici le script le plus nomade qu’il soit, 100% fiable et propre.
copy "%~dp0img.png" "%USERPROFILE%\Desktop\" /Y-> %USERPROFILE% = une variante afin de déposer le fichier uniquement sur le bureau de l’utilsateur connecté.
@echo off
REM copie de l'image sur le bureau des utilisateurs
copy "%~dp0img.png" "%PUBLIC%\Desktop\" /Y
PAUSEEncore plus loin !
Et si, on copiez ce fichier dans un dossier « \Temp » qui n’existe pas à la racine du « C : » ?
@echo off
REM Création du dossier Temp à la racine de C: s'il n'existe pas
if not exist "C:\Temp" mkdir "C:\Temp"
REM Copie de l'image dans le dossier Temp
copy "%~dp0img.png" "C:\Temp\" /Y
PAUSEExplications :
-> REM = remarque dans le script pour expliquer le code.
-> « if not exist » = s’assurer que le dossier n’existe pas avant de le créer (éviter d’avoir un message).
-> copy « %~dp0img.png » « C:\Temp\ » /Y = Copie le fichier situé dans le même dossier que le script vers « C:\Temp\ » en écrasant le fichier existant sans confirmation grâce au paramètre « /Y ».
VOILA !
Un bon script propre, nomade, carré, fiable, etc..
Maintenant que les chemins relatifs et absolus n’ont plus de secrets pour vous, c’est à vous de jouer !