Comment obtenir le chemin du script batch dans Windows?


329

Je sais que %0contient le chemin complet du script batch, par exemplec:\path\to\my\file\abc.bat

Je serais pathégal àc:\path\to\my\file

Comment pourrais-je y parvenir?


2
doublon possible du script de ligne
— Kevin Gosse


1
BTW:% 0 ne contient pas le chemin complet si la chauve-souris est appelée avec une ligne de commande relative. "% ~ Dpf0" serait donc plus fiable dans ce cas.
— vérifie le

Réponses:


563

%~dp0sera le répertoire. Voici une documentation sur tous les modificateurs de chemin . Truc amusant :-)

Pour supprimer la barre oblique inverse finale, vous pouvez utiliser la :n,msyntaxe de sous - chaîne, comme ceci:

SET mypath=%~dp0
echo %mypath:~0,-1%

Je ne pense pas qu'il existe un moyen de combiner la %0syntaxe avec la :~n,msyntaxe, malheureusement.


7
Excellent ... J'utilise %~0\..- je savais qu'il devait y avoir une meilleure façon! De plus, vous voudrez probablement mettre %~dp0des guillemets doubles ( "") au cas où il y aurait des espaces dans le nom du répertoire, etc.
— Cameron

1
Agréable ! Mais, %~dp0contient le `` à la fin. Avez-vous une idée comment l'enlever?
— Misha Moroshko

1
@Misha: Je suppose que vous voulez dire comment supprimer le «\» à la fin. J'ai mis à jour ma réponse avec des détails.
— Dean Harding

2
L'exemple dans la réponse fonctionne correctement sans guillemets même lorsqu'il y a un espace dans le chemin d'accès. (par exemple, SET msg=hello worldfonctionne bien). Cependant, lorsque vous utilisez% mypath% ailleurs, vous devez être prudent de l'utiliser entre guillemets, bien qu'ils ne soient pas nécessaires non cdplus.
— Martin Pain

2
Ce lien est maintenant 404
— StingyJack

12

Vous pouvez utiliser le script suivant pour obtenir le chemin sans ""

for %%i in ("%~dp0.") do SET "mypath=%%~fi"

Cela ne supprime cependant pas le nom de fichier du chemin (par exemple abc.txt dans l'exemple de OP).
— dcp

4
@dcp Er, c'est le cas, cependant.
— Kyle Strand

@Kyle Strand - Ouais, je viens de l'essayer à nouveau et maintenant ça marche bien. Je ne sais pas ce qui s'est passé lorsque je l'ai essayé à l'origine, peut-être que j'ai fait une erreur quelque part dans le script. Désolé pour la confusion, et merci de l'avoir signalé.
— dcp

11

%~dp0peut être un chemin relatif. Pour le convertir en chemin complet, essayez quelque chose comme ceci:

pushd %~dp0
set script_dir=%CD%
popd

6
Ok, alors pourquoi ne pas utiliser %~dp0directement?
— jpaugh

5
Une version pire de la réponse acceptée, publiée 5 ans plus tard? Je ne comprends pas.
— Kyle Strand

J'imagine que cela a été publié pour résoudre le problème mentionné dans les commentaires de la réponse acceptée - %~dp0peut être relatif, ce qui peut ou non être un problème selon le cas d'utilisation
— Michael Mrozek

10
%~dp0ne peut pas contenir un chemin relatif, dsignifie lecteur et pchemin, comment un lecteur pourrait être relatif?
— jeb

5
Dans quel monde? Je viens de tester cette réponse sur Windows Server 2012 r2 et il s'avère que ce %~dp0sera un chemin absolu même lorsque le script a été exécuté comme chemin relatif. Grâce au commentaire de jeb, je n'ai pas été dupe de cette réponse. Pourquoi les gens inventent-ils des trucs et vont-ils commencer à diffuser leur imagination débordante aux autres? J'ai ce collègue qui fait ça, mais j'ai blâmé son (jeune) âge. Je souhaite que mon vote négatif compte.
— bitoolean

0

Vous pouvez utiliser %~dp0, d signifie le lecteur uniquement, p signifie le chemin uniquement, 0 est l'argument pour le nom de fichier complet du fichier de commandes.

Par exemple, si le chemin du fichier était C: \ Users \ Oliver \ Desktop \ example.bat, l'argument serait égal à C: \ Users \ Oliver \ Desktop \, vous pouvez également utiliser la commande set cpath=%~dp0 && set cpath=%cpath:~0,-1%et utiliser la %cpath%variable pour supprimer la barre oblique de fin.


1
Je ne vois pas plus d'informations que dans la réponse de 9 ans
— jeb

Des informations supplémentaires sont «d signifie le lecteur uniquement,…» etc. Merci, @Hayz.
— RJ Dunnill du

-2

%cd% vous donnera le chemin du répertoire à partir duquel le script est exécuté.

Exécutez simplement:

echo %cd%

%CD%est le dossier de travail actuel, pas le dossier, où le fichier de commandes est stocké. Ils peuvent être au même endroit, mais souvent ils ne le sont pas.
— Stephan

-7

Ce serait la %CD%variable.

@echo off
echo %CD%

%CD% renvoie le répertoire courant dans lequel se trouve le script de commandes.


35
% cd% renvoie le répertoire à partir
— duquel

4
cela ne fonctionne que si votre script ne modifie pas le répertoire de travail. Essayez CD C:\Temp <CR> ECHO %CD%( <CR>est une nouvelle ligne ...)
— Dean Harding

6
De plus, si vous cliquez avec le bouton droit sur le script et sélectionnez «Exécuter en tant qu'administrateur», le répertoire de démarrage actuel est C: \ Windows \ System32, quel que soit l'emplacement du script.
— Cameron

Bien que ce ne soit pas une réponse directe à la question d'OP, cette saveur de la fonctionnalité est exactement ce que je cherchais lorsque j'ai trouvé cette question. Merci!
— Zoltán

Aucune des autres solutions publiées ne semble fonctionner pour moi sur Win7 32bit cmd.exe, cela m'est utile au moins.
— Clifford

-8

Je travaille sur une machine Windows 7 et j'ai fini par utiliser les lignes ci-dessous pour obtenir le chemin absolu du dossier pour mon script bash.

Je suis arrivé à cette solution après avoir consulté http://www.linuxjournal.com/content/bash-parameter-expansion .

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder

2
L'OP demande des scripts shell Windows BAT / CMD, pas bash.
— rivy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.