Cosa significa %~dp0 e come funziona?

Trovo %~dp0 molto utile, e lo uso molto per rendere i miei file batch più portatili.

Ma l'etichetta stessa mi sembra molto criptica... Cosa fa il ~? Il dp significa unità e percorso? Il 0 si riferisce a %0, il percorso del file batch che include il nome del file?

O è solo una strana etichetta?

Vorrei anche sapere se è una caratteristica documentata, o qualcosa che tende ad essere deprecato.

Soluzione

Chiamare

for /?

nella riga di comando dà un aiuto su questa sintassi (che può essere usata anche al di fuori di FOR, questo è solo il posto dove si può trovare l'aiuto).

Inoltre, la sostituzione dei riferimenti alle variabili FOR è stata migliorata. Ora puoi usare la seguente

sintassi:

%~I - espande %I rimuovendo qualsiasi apice circostante (") %~fI - espande %I a un nome di percorso completamente qualificato %~dI - espande %I solo a una lettera di unità %~pI - espande %I solo ad un percorso %~nI - espande %I solo ad un nome di file %~xI - espande %I solo all'estensione di un file %~sI - il percorso espanso contiene solo nomi brevi %~aI - espande %I agli attributi del file %~tI - espande %I a data/ora del file %~zI - espande %I alla dimensione del file %~$PATH:I - cerca le directory elencate nella variabile d'ambiente PATH e espande %I al nome pienamente qualificato della prima trovata. Se il nome della variabile d'ambiente non è definito o il file non viene trovato dalla ricerca, allora questo modificatore si espande alla stringa vuota

I modificatori possono essere combinati per ottenere risultati composti:

%~dpI - espande %I solo a una lettera di unità e a un percorso %~nxI - espande %I solo al nome e all'estensione di un file %~fsI - espande %I ad un nome di percorso completo solo con nomi brevi %~dp$PATH:I - cerca le directory elencate nella variabile d'ambiente PATH per %I ed espande alla lettera di unità e percorso della prima trovata. %~ftzaI - espande %I in una linea di output simile a DIR

Negli esempi precedenti %I e PATH possono essere sostituiti da altri valori validi. La sintassi %~ termina con un valido nome di variabile FOR. Scegliere le maiuscole nomi di variabili come %I lo rende più leggibile ed evita la confusione con i modificatori, che non sono sensibili alle maiuscole sensibili alle maiuscole e alle minuscole.

Ci sono diverse lettere che puoi usare come f per "nome completo del percorso", d per lettera di unità, p per percorso, e possono essere combinate. %~ è l'inizio per ciascuna di queste sequenze e un numero I denota che lavora sul parametro %I (dove %0 è il nome completo del file batch, proprio come hai supposto).

Commentari (5)

(In primo luogo, vorrei raccomandare questo sito di riferimento utile per il lotto: http://ss64.com/nt/)

Poi solo un'altra utile spiegazione: http://htipe.wordpress.com/2008/10/09/the-dp0-variable/

La variabile %~dp0

La variabile %~dp0 (che è uno zero) quando si fa riferimento all'interno di un file batch di Windows file batch si espanderà alla lettera drive e path di quel file batch file.

Le variabili %0-%9 si riferiscono ai parametri della linea di comando del file batch file. %1-%9 si riferiscono agli argomenti della riga di comando dopo il nome del file batch. %0 si riferisce al file batch stesso.

Se segui il carattere percentuale (%) con un carattere tilde (~), potete inserire un modificatore prima del numero del parametro per alterare il modo in cui la variabile viene espansa. Il modificatore d si espande alla lettera e il modificatore p si espande al percorso del parametro.

Esempio: Diciamo che avete una directory su C: chiamata bat_files, e in quella directory c'è un file chiamato example.bat. In questo caso, %~dp0 (combinando i modificatori d e p) si espanderà a C:-bat_files.

Controlla questo articolo di Microsoft per una spiegazione completa.

Inoltre, controlla questo thread del forum.

E un riferimento più chiaro da qui:

  • %CmdCmdLine% restituirà l'intera linea di comando come passata a CMD.EXE

  • %* restituirà il resto della linea di comando a partire dal primo argomento della linea di comando (in Windows NT 4, %* include anche tutti gli spazi iniziali)

  • %~dn restituirà la lettera di unità di %n (n può variare da 0 a 9) se %n è un percorso o un nome di file valido (no UNC)

  • %~pn restituirà la directory di %n se %n è un percorso o un nome di file valido (no UNC)

  • %~nn restituisce solo il nome del file di %n se %n è un nome di file valido

  • %~xn restituirà solo l'estensione del file di %n se %n è un nome di file valido

  • %~fn restituirà il percorso completamente qualificato di %n se %n è un nome di file o una directory valida

AGGIUNGI 1

Ho appena trovato qualche buon riferimento per il misterioso operatore tilde ~.

La stringa %~ è chiamata operatore percent tilde. Puoi trovarlo in situazioni come: %~0.

La stringa :~ è chiamata operatore colon tilde. Puoi trovarlo come %SOME_VAR:~0,-1%.

AGGIUNGERE 2 - 1:12 PM 7/6/2018

%1-%9 si riferiscono agli argomenti della riga di comando. Se sono non valori di percorso validi, %~dp1 - %~dp9 si espanderanno tutti allo stesso valore di %~dp0. Ma se sono valori di percorso validi, si espanderanno al suo valore di driver/path.

Per esempio: (batch.bat)

@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on

Esegui 1:

D:\Workbench>batch arg1 arg2

~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\

Esecuzione 2:

D:\Workbench>batch c:\123\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\
Commentari (3)

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true

La variabile %0 in uno script batch è impostata sul nome del file batch in esecuzione. La sintassi speciale ~dp tra il % e il 0 dice fondamentalmente di espandere la variabile %0 per mostrare la lettera dell'unità e il percorso, che ti dà la directory corrente contenente il file batch!

Commentari (2)