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?

Misha Moroshko
la source
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.

Dean Harding
la source
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"
duan
la source
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
Arnaud
la source
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.

Hayz
la source
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%
Uddalak Biswas
la source
%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.

Ruel
la source
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
Jonas
la source
2
L'OP demande des scripts shell Windows BAT / CMD, pas bash.
rivy