Ottieni il nome della cartella corrente con un comando DOS?


60

È possibile ottenere il nome della cartella corrente (non il percorso della directory corrente) utilizzando un comando DOS? Se é cosi, come?

Il più vicino che ho avuto è stato questo ma non lo fa:

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

nota: il tentativo sopra è stato quello di tentare di tokenizzare la stringa e ottenere l'ultimo token impostato come variabile CURR.


Se hai installato una sorta di set di strumenti GNU, dovresti essere in grado di cd | sed "s/.*\\//"(che convoglia l'output di cd (cwd) in una ricerca di espressioni regolari e sostituisci, sostituendo tutto prima del finale \ con nulla)
Phoshi

2
devo evitare gli strumenti GNU in modo che il file batch funzioni ovunque per chiunque. La mia domanda è comunque per "DOS puro".
Djangofan,

Tutto a posto. Un rapido google ha mostrato un risultato SO per l'implementazione della ricerca regex e la sostituzione in VBScript ( stackoverflow.com/questions/127318/… ) che potrebbe utilizzare la stessa sintassi e creare lo stesso risultato - credo che VBScript sia stato integrato da Windows 98, quindi dovrebbe essere praticamente ovunque per tutti! (Potresti anche riavviarlo molto facilmente per funzionare anche su * nix OS ')
Phoshi

3
Cordiali saluti, for /fné TomWij né %~n*sono supportati in MS-DOS. (Windows ' noncmd.exe è DOS, è un programma Windows nativo.)
Grawity

Risposte:


85

Il modo più breve che ho trovato:

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

o all'interno di uno script .bat:

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

o in .bat con Ottieni valore in variabile.

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

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

nx significa solo nome file ed estensione


Mi piace il collegamento e il suggerimento, ma quando lo inserisco in un file batch ottengo una chiusura immediata della shell senza output. ci deve essere un errore di sintassi lì dentro da qualche parte?
Djangofan,

3
L'esempio funzionerà sulla riga di comando in modo interattivo. Per usarlo in un file batch è necessario sostituire tutte le occorrenze di %con %%.
Mike Fitzpatrick,

2
Inoltre, l'esempio non gestisce correttamente i nomi delle cartelle contenenti un punto ( .), ad esempio la cartella% USERPROFILE%.
Mike Fitzpatrick,

1
Sì, funziona se si sostituisce '%' con '%%'. Bella risposta. Sarebbe stata la risposta accettata se ciò fosse stato notato in precedenza.
Djangofan,

1
Qualunque cosa sia questa terribile stregoneria malvagia, sono felice che funzioni. Conosco la maggior parte della sintassi di espansione, ma non l'ho mai visto *usato prima di oo
kayleeFrye_onDeck

30

Se vuoi conoscere la posizione corrente del file batch (e se la tua Windows non è una versione molto antica), digita for /?una finestra 'DOS box'. Scorri verso il basso. Leggere.

Scoprirai che ora puoi leggere ( dall'interno del file batch) queste variabili:

%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 ...]

Questo funziona per molti casi. Supponiamo che venga chiamato il file batch mytest.bat. Puoi chiamarlo in diversi modi:

  1. ..\..\to\mytest.bat ............................... (percorso relativo)
  2. d:\path\to\mytest.bat........................... (percorso completo)
  3. \\fileserver\sharename\mytest.bat... (percorso sulla condivisione remota)

... e otterrai sempre il giusto valore nelle tue variabili.


1
wow, abbastanza interessante il tuo diritto. il comando "echo% ~ dp0" risolve anche il mio problema ed è più elegante.
Djangofan,

5
Ok allora - ti preoccupi di assegnarmi un '+1' allora?
Kurt Pfeifle,

No, per il motivo che "per /?" è stato il primo posto ovvio in cui ho cercato e quindi questa risposta non è migliore di quanto ci si aspetti da nessuno.
Djangofan,

4
@djangofan: Quindi dici "Wow, abbastanza interessante, hai ragione ..." a qualcosa che già sapevi ?! Ad una risposta che non ha contribuito alla tua conoscenza? (Sai, "+1" sta facendo clic sul ^ -arrow - è diverso dal dare una risposta a quella accettata ....)
Kurt Pfeifle,

1
sembra che l'ultimo dovrebbe essere %~dpnx0, no?
luc

15

Personalmente mi è piaciuta la risposta di Toms, fino a quando ha lottato con i punti nei nomi delle directory. Questo mi ha dato un suggerimento:

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

5

La risposta di Tom è buona, ma se hai un nome di directory con un punto (cioè wxwidgets-2.9.4) otterrai solo il nome completo. Quindi questo produrrebbe invece wxwidgets-2.9 ​​perché .4 è stato trattato come un'estensione (Sì, anche se è un nome di directory!).

Per ottenere il nome di output completo devi aggiungere l'estensione alla fine:

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

e in modalità file batch:

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

O ovviamente, imposta invece una variabile nel file batch:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI

4

Un altro modo è:

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

funziona con "." e spazi nel percorso

Che cosa fa?

  1. metti l'intero nome del file (driveletter-path-nomefile-estensione) in MyPathVar

  2. rimuove il nome del file e l'estensione da MyPathvar

Funziona anche con percorsi UNC. Se hai bisogno di una barra rovesciata alla fine del percorso. Rimuovere il comando \after MyPathnel secondo set set, ad es.

set "MyPath=%%MyPath:%~nx0=%%"

1
Quindi, come è diverso da%~dp0
Amit Naidu il

4

È possibile ottenere la directory corrente in una variabile. One-liner:

set a=%cd%

Controllare con

echo %a%

6
Vuole il nome della directory corrente, non l'intero percorso, e come == cd, puoi anche usare% cd%.
paradroid

2

semplice

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

o

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

Fai attenzione alla barra rovesciata della fine del percorso, non deve essere barra rovesciata della fine.


1

La mia risposta in questa discussione lo fa in 3 semplici righe:

@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

1

Questo funziona per me da un file batch. Restituisce il nome della directory di lavoro corrente.

pushd %1 & for %%i in (.) do @echo %%~ni
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.