Ottieni la directory del file batch corrente


283

In primo luogo, ho visto questo argomento ma non riuscivo a capirlo.

Domanda:

Esiste un file batch D:\path\to\file.batcon il seguente contenuto:

echo %cd%
pause

L'output è:

C:\

Dev'essere D:\path\to

Che cosa sto facendo di sbagliato?


7
Dovresti leggere tutte le risposte a una domanda, in particolare le persone con voti più alti, non solo quella accettata. La risposta con il punteggio più alto nel tuo link pubblicato risponde già alla tua domanda.
dbenham,

4
Se ti trovi in ​​c: \ quando digiti il ​​nome del file batch, allora c: \ è ciò che verrà stampato% cd%.
foxidrive,

Risposte:


497

La variabile di sola lettura del sistema %CD%mantiene il percorso del chiamante del batch, non la posizione del file batch.

È possibile ottenere il nome dello script batch stesso come digitato dall'utente con %0(ad esempio scripts\mybatch.bat). A questo si possono applicare estensioni di parametri in modo %~dp0da restituire Drive e Path allo script batch (ad es. W:\scripts\) E %~f0restituire il percorso completo (ad es W:\scripts\mybatch.cmd.).

È possibile fare riferimento ad altri file nella stessa cartella dello script batch utilizzando questa sintassi:

CALL %0\..\SecondBatch.cmd

Questo può anche essere usato in una subroutine, Echo %0darà l'etichetta di chiamata ma, echo "%~nx0"ti darà il nome del file dello script batch.

Quando la %0variabile viene espansa, il risultato viene racchiuso tra virgolette.

Altro sui parametri batch .


1
Guarda, non ho bisogno di correre stm.sqlin D:\Dir1\Dir2\stm.sql. Devo mysql.exe -u root -p mysql < %cd%\stm.sqleseguire i comandi stm.sql.
Hamed Kamrava,

@HamedKamrava è per il mio batch SQL? file batch come *.bato *.sh?
Stoleg,

@ Stoleg- In effetti, ci sono 2 file in D:\Dir1\Dir2\batchfile.bate D:\Dir1\Dir2\stm.sql. Il contenuto batchfile.bat è: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sqle il contenuto stm.sql è composto da alcuni comandi MySQL.
Hamed Kamrava,

1
La variabile di sola lettura del sistema% CD% mantiene il percorso del chiamante del batch, non la posizione del file batch.
Stoleg,

35
echo %~dp0restituirà il percorso alla posizione batch. echo %~f0restituirà il percorso al batch con nome file.
Stoleg,

119

Molto semplice:

setlocal
cd /d %~dp0
File.exe

9
Il codice è breve ma non è semplice da capire. Che cos'è questo File.exe? Il percorso della directory corrente è memorizzato in% ~ dp0?
Ivailo Bardarov,

Questa risposta in realtà risponde alla domanda, penso. Complimenti.
macetw,

3
Ho appena usato cd /d %~dp0come prima riga di file batch e
ho

perché serve setlocal? ritorna bene anche senza quello?
T.Todua,

1
@ T.Todua "setlocal" fa sì che qualsiasi modifica all'ambiente, inclusa la directory corrente, sia contenuta fino alla fine del file batch o al verificarsi di un "endlocal". Se hai intenzione di cambiare le variabili di ambiente o la directory corrente, è una buona forma.
Jamie,

30

Nel tuo file .bat:

set mypath=%cd%

Ora puoi usare la variabile %mypath%per fare riferimento al percorso del .batfile al file. Per verificare che il percorso sia corretto:

@echo %mypath%

Ad esempio, un file chiamato DIR.batcon i seguenti contenuti

set mypath=%cd%
@echo %mypath%
Pause

eseguito dalla directory g:\test\batfarà eco a quel percorso nella finestra di comando DOS.


1
questa è la soluzione migliore e più semplice
Nani,

7
Questa non è una buona soluzione perché non tiene conto dello script batch chiamato da un altro file su un altro percorso.
theQuestionMan

anche quando eseguito come autorizzazioni elevate,% cd% restituisce C: \ Windows \ system32 ma non la directory in cui è memorizzato.
PravyNandas,

9

Ecco cosa uso nella parte superiore di tutti i miei file batch. Ho appena copiato / incollato dalla mia cartella dei modelli.

@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"

L'impostazione del percorso del file batch corrente su% batdir% consente di chiamarlo negli stts successivi nel file batch corrente, indipendentemente da dove questo file batch viene modificato. L'uso di PUSHD consente di utilizzare POPD per impostare rapidamente il percorso di questo file batch su% batdir% originale. Ricorda, se si utilizza% batdir% ExtraDir o% batdir% \ ExtraDir (a seconda della versione utilizzata in precedenza, terminando la barra rovesciata o meno) sarà necessario racchiudere l'intera stringa tra virgolette doppie se il percorso ha spazi (ovvero "% batdir% ExtraDir" ). Puoi sempre usare PUSHD% ~ dp0. [https: // ss64.com/ nt / syntax-args .html] ha di più sui parametri (% ~).

Nota che l'uso di (: :) all'inizio di una riga la rende una riga di commento. Ancora più importante, l'uso di :: consente di includere redirector, pipe, caratteri speciali (cioè <> | ecc) in quel commento.

:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt

Naturalmente, Powershell fa questo e molto altro.


2
Ottima risposta, grazie mille! :-) Fai attenzione alla tua seconda tecnica ( set batdir=%CD%). Non va bene, perché è il percorso del chiamante, non il file bat stesso. L'unico modo valido per ottenere il percorso del file bat in esecuzione è %~dp0.
Mitch McMabers,
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.