Cosa significa% ~ dp0 e come funziona?


1024

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

Ma l'etichetta stessa mi sembra molto enigmatica ... Cosa sta ~facendo? Fa dpauto media e il percorso? Fa 0riferimento al %0percorso del file batch che include il nome del file?

O è solo un'etichetta strana?

Vorrei anche sapere se si tratta di una funzionalità documentata o di qualcosa che può essere deprecato.



2
Hai ragione, Hellen. Quella domanda non è stata visualizzata quando ho cercato% ~ dp0. Forse perché ha% ~ d0 sul titolo anziché% ~ dp0.
Sebastián Grignoli,

9
SymbolHound è ottimo per condurre ricerche su caratteri diversi dai caratteri alfanumerici. Ad esempio, cerca%~dp0 . Di solito trovo che i risultati migliori si riferiscano al contenuto su SO.
DavidRR,

SymbolHound non ha funzionato per me con la ricerca symbolhound.com/?q=%25~dp0 . Tuttavia, ha funzionato: google.com/search?q=%25~dp0 - basta dire ...
Kristopher,

1
SymbolHound 2019: non funziona e uMatrix indica che si collega a siti di terze parti come blockchain.info e paypalobjects.com.
Nils Lindemann,

Risposte:


811

chiamata

for /?

nella riga di comando fornisce aiuto su questa sintassi (che può essere utilizzata anche al di fuori di FOR, questo è solo il luogo in cui è possibile trovare aiuto).

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

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

I modificatori possono essere combinati per ottenere risultati composti:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

Negli esempi precedenti,% I e PATH possono essere sostituiti da altri valori validi. La sintassi% ~ è terminata da un nome di variabile FOR valido. Scegliere nomi di variabili maiuscole come% I rende più leggibile ed evita confusione con i modificatori, che non fanno distinzione tra maiuscole e minuscole.

Esistono diverse lettere che è possibile utilizzare come f"nome percorso completo", dlettera di unità, ppercorso e possono essere combinate. %~è l'inizio per ciascuna di quelle sequenze e un numero Iindica che funziona sul parametro %I(dove si %0trova il nome completo del file batch, proprio come si presuppone).


2
Non conosco nessun altro, ma ottengo "Il seguente utilizzo dell'operatore percorso nella sostituzione dei parametri batch non è valido. Per formati validi, digitare CALL /? O FOR / ?. La sintassi del comando non è corretta." quando si utilizza I. Devo usare al 0posto di I. Non so se mi sono perso qualcosa o altro, ma sto solo facendo sapere alla gente.
mythofechelon,

71
@BenHooper, Iè un segnaposto per l'indice variabile. 0= il file chiamante, 1= argomento # 1, 2= argomento # 2, ecc ...
Chris,

9
Questa risposta è buona Ed esaustivo. Per un po 'più di brevità, mi piace la risposta a questa domanda quasi duplicata: stackoverflow.com/questions/112055/…
Frank Nocke,

1
Questa risposta è un po 'confusa perché queste sostituzioni possono essere utilizzate al di fuori di FOR.
David,

348

(Innanzitutto, vorrei raccomandare questo utile sito di riferimento per il batch: http://ss64.com/nt/ )

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

La variabile% ~ dp0

L'% ~ dp0 (che è uno zero) variabile quando si fa riferimento all'interno di un file batch di Windows si espanderà al d lettera rive e p ath di quel file batch.

Le variabili% 0-% 9 si riferiscono ai parametri della riga di comando del file batch. % 1-% 9 fa riferimento 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 (~), puoi inserire uno o più modificatori prima del numero del parametro per modificare il modo in cui la variabile viene espansa. Il modificatore d si espande nella lettera di unità e il modificatore p si espande nel percorso del parametro.

Esempio: supponiamo che tu abbia una directory su C: chiamata bat_files, e in quella directory c'è un file chiamato esempio.bat. In questo caso,% ~ dp0 (combinando i modificatori d e p) si espanderà in C: \ bat_files.

Dai un'occhiata a questo articolo Microsoft per una spiegazione completa.

Inoltre, dai un'occhiata a questo thread del forum .

E un riferimento più chiaro da qui :

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

  • %* restituirà il resto della riga di comando a partire dal primo argomento della riga 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 file valido (no UNC)

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

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

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

  • %~fn restituirà il percorso completo di% n se% n è un nome file o una directory validi

AGGIUNGI 1

Ho appena trovato dei buoni riferimenti per il misterioso ~ operatore di tilde.

La %~stringa si chiama percent tilde operator. Lo si può trovare in situazioni come: %~0.

La :~stringa si chiama operatore tilde due punti . Puoi trovarlo come %SOME_VAR:~0,-1%.

AGGIUNGI 2 - 13:12 6/7/2018

%1-%9fare riferimento agli arg della riga di comando. Se sono non valori percorso valido, %~dp1- %~dp9saranno tutti espanderà per lo stesso valore %~dp0. Ma se sono valori di percorso validi, si espanderanno al proprio valore di driver / percorso.

Ad 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\

Esegui 2:

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

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\

Anche curioso di questo concetto e ho trovato il buon chiarimento qui. Grazie Mingge. ^ _ ^
Eugene,

1
per me si espande in c: \ bat_files \ (con separatore di percorso finale)
santa

I collegamenti all'articolo Microsoft e al thread del forum non funzionano più :(
wovano,

151

La variabile %0in uno script batch è impostata sul nome del file batch in esecuzione.

La ~dpsintassi speciale tra il %e il 0fondamentalmente dice di espandere la variabile %0per mostrare la lettera e il percorso dell'unità, che fornisce la directory corrente contenente il file batch!

Aiuto = Link


@Andy, c'è un modo per testare %0direttamente nel cmd senza salvare un file .bat sul disco rigido locale?
Pacerier,

Il collegamento è interrotto e non riesco a trovare il collegamento corretto. Una modifica in sospeso ha ancora il collegamento interrotto.
George_E,

44

% ~ dp0 si espande nel percorso di directory corrente del file batch in esecuzione.

Per una chiara comprensione, creiamo un file batch in una directory.

C: \ sceneggiatura \ test.bat

con contenuti:

@echo off
echo %~dp0

Quando lo esegui dal prompt dei comandi, vedrai questo risultato:

C: \ script di \


41

Un altro suggerimento che sarebbe di grande aiuto è che per impostare la directory corrente su un'unità diversa si dovrebbe usare %~d0prima, quindi cd %~dp0. Ciò cambierà la directory nell'unità del file batch, quindi cambierà nella sua cartella.

In alternativa, per #oneLinerLovers, come sottolineato da @Omni nei commenti cd /d %~dp0cambierà sia l'unità che la directory :)

Spero che questo aiuti qualcuno.


23
cdha un parametro integrato che cambierà sia l'unità che la cartella:cd /d %~dp0
OmnipotentEntity

2
Hai ragione e l' /dargomento è utile, ma merita di essere pubblicato come risposta alternativa candidata e non come commento a questo. Grazie per averlo sottolineato, però, non lo sapevo :)
Marvin Thobejane,

4
potresti anche usare '' pushd% ~ dp0 '' per cambiare unità e cartella
fmuecke,

25

Grande esempio del lanciatore di shell portatile di Strawberry Perl:

set drive=%~dp0
set drivep=%drive%
if #%drive:~-1%# == #\# set drivep=%drive:~0,-1%

set PATH=%drivep%\perl\site\bin;%drivep%\perl\bin;%drivep%\c\bin;%PATH%

non sono sicuro di cosa stia facendo il negativo 1, ma funziona a meraviglia!


11
+1 molto utile. L'istruzione if verifica se è presente una barra rovesciata e, se necessario, rimuove la barra rovesciata. Il 1 negativo nella condizione estrae l'ultimo carattere e l'espressione nell'istruzione set prende la stringa del percorso meno l'ultimo carattere (che è la barra rovesciata).
Matt,

1
il negativo 1 è meno l'ultimo carattere. Leggi sottostringa variabile
phuclv,

12

Un esempio sarebbe bello - eccone uno banale

for %I in (*.*) do @echo %~xI

elenca solo le ESTENSIONI di ciascun file nella cartella corrente

per combinazioni di variabili più utili (elencate anche nella risposta precedente) dal prompt CMD, eseguire: HELP FOR che contiene questo frammento

I modificatori possono essere combinati per ottenere risultati composti:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

ho ricevuto "~ xSono stato inaspettato in questo momento." provando l'esempio - è perché sto usando Win 7?
capitolo

Questa è una buona informazione, ma non riesce a indirizzare il post originale.
De Shan Baptiste,
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.