Obtenir le nom du dossier actuel par une commande DOS?

60

Est-il possible d'obtenir le nom du dossier actuel (pas le chemin du répertoire actuel) en utilisant une commande DOS? Si c'est le cas, comment?

Le plus proche que j'ai eu était celui-ci mais il ne le fait pas:

for /f "delims=\" %%a in ("%CD%") do set CURR=%%a
echo.DIR: %CURR%

remarque: la tentative ci-dessus était une tentative de tokenize de la chaîne et d'obtenir le dernier jeton défini en tant que variable CURR.

djangofan
la source
Si vous avez une sorte d’ensemble d’outils GNU installé, vous devriez être en mesure d’y aller cd | sed "s/.*\\//"(pour canaliser la sortie de cd (cwd) dans une recherche d’expression régulière et la remplacer, en remplaçant tout ce qui se trouve avant la \ finale sans rien du tout)
Phoshi
2
Je dois éviter les outils GNU pour que le fichier de commandes fonctionne n'importe où pour n'importe qui. Ma question concerne de toute façon le "DOS pur".
djangofan
Bien. Un rapide Google a montré un résultat SO pour implémenter la recherche de regex et le remplacer dans VBScript ( stackoverflow.com/questions/127318/… ) qui pourrait utiliser la même syntaxe et créer le même résultat - je crois que VBScript a été intégré depuis Windows 98, donc devrait être tout à fait n'importe où pour tout le monde! (Vous pouvez aussi très facilement le modifier pour qu'il fonctionne sur * nix OS 'aussi)
Phoshi le
3
Pour votre information, ni for /fni TomWij %~n*sont pris en charge dans MS-DOS. (Windows ' cmd.exen'est pas DOS, c'est un programme Windows natif.)
grawity

Réponses:

85

Plus court chemin que j'ai trouvé:

for %I in (.) do echo %~nxI

ou dans un script .bat:

for %%I in (.) do echo %%~nxI

ou en .bat avec Get dans variable.

for %%I in (.) do set CurrDirName=%%~nxI
echo %CurrDirName%

Explication: http://www.robvanderwoude.com/ntfor.php

nx signifie nom de fichier et extension uniquement

Tamara Wijsman
la source
J'aime le lien et la suggestion, mais lorsque je mets cela dans un fichier batch, je reçois une fermeture immédiate du shell sans sortie. il doit y avoir une erreur de syntaxe quelque part?
djangofan
3
L'exemple fonctionnera de manière interactive sur la ligne de commande. Pour l'utiliser dans un fichier de commandes, vous devez remplacer toutes les occurrences de %avec %%.
Mike Fitzpatrick
2
En outre, l'exemple ne gère pas correctement les noms de dossier contenant un point ( .), tel que mon dossier% USERPROFILE%.
Mike Fitzpatrick
1
Oui, fonctionne si vous remplacez '%' par '%%'. Bonne réponse. Cela aurait été la réponse acceptée si cela avait été noté plus tôt.
djangofan
1
Quelle que soit cette terrible sorcellerie diabolique, je suis heureux que cela fonctionne. Je connais la plupart des syntaxes d'expansion, mais je ne les ai jamais *utilisées auparavant oo
kayleeFrye_onDeck
30

Si vous souhaitez connaître l'emplacement actuel du fichier de commandes (et si votre version de Windows n'est pas une version très ancienne), saisissez for /?une fenêtre "Boîte DOS". Défiler vers le bas. Lis.

Vous découvrirez que vous pouvez maintenant lire ( à partir à l' intérieur du fichier de commandes) ces variables:

%0      - as the name how this batchfile was called
%~d0    - as the drive letter where this batchfile is located ('\\' in case of share)
%~p0    - as path (without the drive letter) where this batchfile is located
%~n0    - as filename (without suffix) of this batchfile
%~x0    - as filename's suffix (without filename) of this batchfile
%~a0    - as this batchfile's file attributes
%~t0    - as this batchfile's date+time
%~z0    - as this batchfile's filesize
%~dpnx0 - as this batchfile's fully qualified path+filename
[... and then some more ...]

Cela fonctionne dans de nombreux cas. Supposons que le fichier de commandes s'appelle mytest.bat. Vous pouvez l'appeler de différentes manières:

  1. ..\..\to\mytest.bat ............................... (chemin relatif)
  2. d:\path\to\mytest.bat........................... (chemin complet)
  3. \\fileserver\sharename\mytest.bat... (chemin sur le partage distant)

... et vous obtiendrez toujours la bonne valeur dans vos variables.

Kurt Pfeifle
la source
1
wow, curieusement votre droite. la commande "echo% ~ dp0" résout aussi mon problème et sa plus élégante.
djangofan
5
Ok alors - vous voulez bien m'accorder un '+1'?
Kurt Pfeifle
Non, pour la raison que 'pour /?' C’était le premier endroit évident où j’ai regardé et cette réponse n’est donc pas meilleure que ce à quoi tout le monde s’attend.
djangofan
4
@djangofan: Alors vous dites "Waouh, curieusement, vous avez raison ..." à quelque chose que vous saviez déjà?! Une réponse qui n'a pas contribué à vos connaissances? (Vous savez, '+1' clique sur la ^ --arrow - c'est différent de donner une réponse à la réponse acceptée ....)
Kurt Pfeifle le
1
il semble que le dernier devrait être %~dpnx0, n'est-ce pas?
luc
15

Personnellement, j’ai aimé la réponse de Toms, jusqu’à ce qu’elle se débatte avec des points dans les noms de dir. Cela m'a donné un indice:

for /f "delims=\" %%a in ("%cd%") do echo topmost dir: %%~nxa
Marc Wittke
la source
5

La réponse de Tom est bonne, mais si vous avez un nom de répertoire avec un point (par exemple, wxwidgets-2.9.4), vous n'obtiendrez que le nom complet. Donc, cela produirait wxwidgets-2.9 ​​à la place car le .4 a été traité comme une extension (Oui, même s’il s’agit d’un nom de répertoire!).

Pour obtenir le nom complet de la sortie, vous devez ajouter l'extension à la fin:

FOR %I IN (.) DO Echo %~nI%~xI

et en mode de traitement par lots:

FOR %%I IN (.) DO Echo %%~nI%%~xI

Ou bien sûr, définissez une variable dans le fichier de commandes à la place:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI
Brian Sidebotham
la source
4

Une autre façon est:

set "MyPath=%~dpnx0" & call set "MyPath=%%MyPath:\%~nx0=%%" 
echo MyPath=%MyPath%  

cela fonctionne avec "." et espaces dans le chemin

Qu'est ce que ça fait?

  1. place le nom de fichier entier (driveletter-path-filename-extension) dans MyPathVar

  2. supprimer le nom de fichier et l'extension de MyPathvar

Cela fonctionne aussi avec les chemins UNC. Si vous avez besoin de la barre oblique inverse à la fin du chemin. Supprimez le \après MyPathdans la deuxième commande set, par exemple.

set "MyPath=%%MyPath:%~nx0=%%"
Lenz
la source
1
Alors, en quoi est-ce différent de%~dp0
Amit Naidu
4

Vous pouvez obtenir le répertoire courant dans une variable. Bon mot:

set a=%cd%

Vérifier avec

echo %a%
Vera
la source
6
Il veut le nom du répertoire actuel, pas le chemin complet, et en tant que == cd, vous pouvez aussi utiliser% cd%.
Parroïde
2

juste simple

for %%d in ("%CD%") do echo %%~nxd

ou

set "sPath=."
for %%d in ("%sPath%") do set "sDirName=%%~nxd"

Faites attention à la barre oblique inverse de la fin du chemin, il ne doit pas s'agir d'une barre oblique inverse de la fin.

Kygg
la source
1

Ma réponse dans ce fil le fait en 3 lignes simples:

@echo off
SET "CDIR=%~dp0"
:: for loop requires removing trailing backslash from %~dp0 output
SET "CDIR=%CDIR:~0,-1%"
FOR %%i IN ("%CDIR%") DO SET "PARENTFOLDERNAME=%%~nxi"
ECHO Parent folder: %PARENTFOLDERNAME%
ECHO Full path: %~dp0
pause>nul
djangofan
la source
1

Cela fonctionne pour moi à partir d'un fichier de commandes. Il renvoie le nom du répertoire de travail actuel.

pushd %1 & for %%i in (.) do @echo %%~ni
nem50
la source