Come ottenere il percorso dello script batch in Windows?


329

So che %0contiene il percorso completo dello script batch, ad esc:\path\to\my\file\abc.bat

Vorrei pathessere uguale ac:\path\to\my\file

Come potrei farlo?


2
possibile duplicato della riga
Kevin Gosse,


1
A proposito:% 0 non contiene il percorso completo se il pipistrello viene chiamato con una riga di comando relativa. Quindi "% ~ dpf0" sarebbe più affidabile per questo caso.
Verifica il

Risposte:


563

%~dp0sarà la directory. Ecco della documentazione su tutti i modificatori di percorso . Cose divertenti :-)

Per rimuovere la barra rovesciata finale, è possibile utilizzare la :n,msintassi della sottostringa, in questo modo:

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

Sfortunatamente, non credo che ci sia un modo per combinare la %0sintassi con la :~n,msintassi.


7
Eccellente ... Ho usato %~0\..- sapevo che doveva esserci un modo migliore! Inoltre, probabilmente vorrai racchiuderlo %~dp0tra virgolette doppie ( "") nel caso in cui ci siano spazi nel nome della directory, ecc.
Cameron

1
Bello ! Ma %~dp0contiene il simbolo `` alla fine. Hai idea di come rimuoverlo?
Misha Moroshko,

1
@Misha: suppongo tu intenda come rimuovere il carattere \ "alla fine. Ho aggiornato la mia risposta con i dettagli.
Dean Harding,

2
L'esempio nella risposta funziona bene senza virgolette anche quando c'è uno spazio nel percorso. (es. SET msg=hello worldfunziona benissimo). Tuttavia, quando usi% mypath% altrove, devi fare attenzione a usarlo tra virgolette, anche se non sono necessari per cdnessuno dei due.
Martin Pain,

2
Quel link ora è 404
StingyJack

12

È possibile utilizzare il seguente script per ottenere il percorso senza trascinare "\"

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

Ciò tuttavia non rimuove il nome file dal percorso (ad es. Abc.txt nell'esempio di OP).
dcp,

4
@dcp Er, lo fa, però.
Kyle Strand,

@Kyle Strand - Sì, l'ho appena provato di nuovo e ora funziona bene. Non sono sicuro di cosa sia successo quando l'ho provato inizialmente, forse ho fatto un errore da qualche parte nella sceneggiatura. Ci scusiamo per la confusione e grazie per averlo sottolineato.
dcp,

11

%~dp0può essere un percorso relativo. Per convertirlo in un percorso completo, prova qualcosa del genere:

pushd %~dp0
set script_dir=%CD%
popd

6
Ok, quindi perché non utilizzarlo %~dp0direttamente?
jpaugh

5
Una versione peggiore della risposta accettata, pubblicata 5 anni dopo? Non capisco.
Kyle Strand,

Immagino che questo sia stato pubblicato per risolvere il problema menzionato nei commenti della risposta accettata - %~dp0può essere relativo, il che può essere o meno un problema a seconda del caso d'uso
Michael Mrozek,

10
%~dp0non può contenere un percorso relativo, dsta per drive e pper path, come può essere relativo un drive?
Jeb

5
In quale mondo? Ho appena testato questa risposta su Windows Server 2012 r2 e si scopre che %~dp0sarà un percorso assoluto anche quando lo script è stato eseguito come percorso relativo. Grazie al commento di Jeb, non sono stato ingannato da questa risposta. Perché le persone semplicemente inventano cose e vanno e iniziano a diffondere la loro immaginazione selvaggia agli altri. Ho questo collega che lo fa, ma ho incolpato la sua (giovane) età. Vorrei che il mio voto negativo conta.
Bitoolean,

0

È possibile utilizzare %~dp0, d indica solo l'unità, p indica solo il percorso, 0 è l'argomento per il nome file completo del file batch.

Ad esempio, se il percorso del file fosse C: \ Users \ Oliver \ Desktop \ example.bat, l'argomento sarebbe uguale a C: \ Users \ Oliver \ Desktop \, inoltre è possibile utilizzare il comando set cpath=%~dp0 && set cpath=%cpath:~0,-1%e utilizzare la %cpath%variabile per rimuovere la barra finale.


1
Non riesco a vedere più informazioni, rispetto alla risposta di 9 anni
jeb

Le informazioni aggiuntive sono "d indica solo l'unità, ..." ecc. Grazie, @Hayz.
RJ Dunnill,

-2

%cd% ti darà il percorso della directory da cui è in esecuzione lo script.

Corri:

echo %cd%

%CD%è la cartella di lavoro corrente, non la cartella, in cui è archiviato il file batch. Possono essere nella stessa posizione, ma spesso non lo sono.
Stephan

-7

Questa sarebbe la %CD%variabile.

@echo off
echo %CD%

%CD% restituisce la directory corrente in cui si trova lo script batch.


35
% cd% restituisce la directory da cui è stato eseguito lo script, non la directory in cui si trova lo script.
Misha Moroshko

4
funziona solo se lo script non modifica la directory di lavoro. Prova CD C:\Temp <CR> ECHO %CD%( <CR>è newline ...)
Dean Harding,

6
Inoltre, se si fa clic con il pulsante destro del mouse sullo script e si seleziona "Esegui come amministratore", la directory corrente iniziale è C: \ Windows \ System32 indipendentemente dalla posizione dello script.
Cameron,

Sebbene non sia una risposta diretta alla domanda di OP, questo tipo di funzionalità è esattamente quello che stavo cercando quando ho trovato questa domanda. Grazie!
Zoltán,

Nessuna delle altre soluzioni pubblicate sembra funzionare per me su Win7 32 bit cmd.exe, questo mi è utile almeno.
Clifford,

-8

Sto lavorando su una macchina Windows 7 e ho finito per usare le righe seguenti per ottenere il percorso della cartella assoluta per il mio script bash.

Sono arrivato a questa soluzione dopo aver visto 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 sta chiedendo degli script shell BAT / CMD di Windows, non bash.
Rivy
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.