Cosa significa% ~ d0 in un file batch di Windows?


355

Sto guardando un file batch che definisce le seguenti variabili:

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • Cosa significano %~d0o %~p0realmente significano?
  • Esiste un insieme di valori noti per cose come directory corrente, unità, parametri di uno script?
  • Ci sono altre scorciatoie simili che potrei usare?

Risposte:


541

Le variabili magiche %n contengono gli argomenti utilizzati per invocare il file: %0è il percorso del file bat stesso, %1è il primo argomento dopo, %2è il secondo e così via.

Poiché gli argomenti sono spesso percorsi di file, esiste una sintassi aggiuntiva per estrarre parti del percorso. ~dè unità, ~pè il percorso (senza unità), ~nè il nome del file. Possono essere combinati così ~dpè drive + path.

%~dp0 è quindi abbastanza utile in un pipistrello: è la cartella in cui risiede il file bat in esecuzione.

Puoi anche ottenere altri tipi di meta informazioni sul file: ~tè il timestamp, ~zè la dimensione.

Cerca qui un riferimento per tutti i comandi della riga di comando. I codici tilde-magic sono descritti sotto per .


15
nota a sé: echo %~dp0non funzionerà dalla riga di comando, solo in un file batch. Duh!
Northben,

2
c'è una differenza tra %~d0e %~d0%?
Geoffrey,

2
@Pacerier:% 0 è il percorso completo incluso il nome file dello script. % ~ dp0 è il percorso della cartella contenente lo script ma escluso il nome file dello script.
JacquesB,

4
nota a self: echo %~pd0fornisce lo stesso output di eco %~dp0(anziché inverso come previsto). Inoltre, il valore di %0è diverso a seconda che si faccia doppio clic sul file batch o lo si esegua da cmd.
Pacerier,

152

Sono sostituzioni variabili migliorate. Modificano le variabili% N utilizzate nei file batch. Molto utile se ti interessa la programmazione batch in Windows.

%~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

Puoi trovare quanto sopra eseguendo FOR /?.


48

Sì, ci sono altre scorciatoie che puoi usare che sono fornite di seguito. Nel tuo comando, ~ d0 significherebbe la lettera di unità del 0 ° argomento.

~ expands the given variable
d gets the drive letter only
0 is the argument you are referencing

Poiché l'argomento 0 è il percorso dello script, ottiene la lettera di unità del percorso per te. Puoi anche usare le seguenti scorciatoie.

%~1         - expands %1 removing any surrounding quotes (")
%~f1        - expands %1 to a fully qualified path name
%~d1        - expands %1 to a drive letter only
%~p1        - expands %1 to a path only
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
%~s1        - expanded path contains short names only
%~a1        - expands %1 to file attributes
%~t1        - expands %1 to date/time of file
%~z1        - expands %1 to size of file
%~$PATH:1   - searches the directories listed in the PATH
               environment variable and expands %1 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    

%~dp1       - expands %1 to a drive letter and path only
%~nx1       - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
               environment variable for %1 and expands to the
               drive letter and path of the first one found.
%~ftza1     - expands %1 to a DIR like output line

Questo può essere trovato anche direttamente nel prompt dei comandi quando si esegue CALL /? o per /?



9

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.

Per #oneLinerLovers, cd /d %~dp0 cambierà sia l'unità che la directory :)

Spero che questo aiuti qualcuno.


7
un'altra opzione è pushd %~dp0, che non ha alcun problema a cambiare l'unità corrente e ti dà il vantaggio di poter popdtornare all'unità / percorso originale in un secondo momento.
scrive il

7

%~d0ti dà la lettera di unità dell'argomento 0 (il nome dello script), %~p0il percorso.


6

Alcuni aspetti da tenere d'occhio:

Se si fa doppio clic sul file batch %0verrà racchiuso tra virgolette. Ad esempio, se si salva questo file come c:\test.bat:

@echo %0
@pause

Facendo doppio clic su di esso si aprirà un nuovo prompt dei comandi con output:

"C:\test.bat"

Ma se prima apri un prompt dei comandi e lo chiami direttamente da quel prompt dei comandi, %0farà riferimento a qualsiasi cosa tu abbia digitato . Se digiti test.batEnter, l'output di %0non avrà virgolette perché non hai digitato virgolette:

c:\>test.bat
test.bat

Se digiti testEnter, anche l'output di %0non avrà estensione, poiché non hai digitato alcuna estensione:

c:\>test
test

Lo stesso per tEsTEnter:

c:\>tEsT
tEsT

Se digiti "test"Enter, l'output di %0avrà virgolette (dal momento che le hai digitate) ma nessuna estensione:

c:\>"test"
"test"

Infine, se digiti "C:\test.bat", l'output sarebbe esattamente come se avessi fatto doppio clic su di esso:

c:\>"C:\test.bat"
"C:\test.bat"

Si noti che questi non sono tutti i possibili valori %0perché è possibile chiamare lo script da altre cartelle:

c:\some_folder>/../teST.bAt
/../teST.bAt

Anche tutti gli esempi mostrati sopra influenzeranno %~0, perché l'output di %~0è semplicemente l'output di %0 virgolette meno (se presenti).


3

Questo codice spiega l'uso del carattere ~ tilda, che è stata la cosa più confusa per me. Una volta capito questo, rende le cose molto più facili da capire:

@ECHO off
SET "PATH=%~dp0;%PATH%"
ECHO %PATH%
ECHO.
CALL :testargs "these are days" "when the brave endure"
GOTO :pauseit
:testargs
SET ARGS=%~1;%~2;%1;%2
ECHO %ARGS%
ECHO.
exit /B 0
:pauseit
pause

1

Visualizza la posizione corrente del file o della directory in cui ci si trova attualmente. Ad esempio; se il file batch si trovava nella directory desktop, "% ~ dp0" visualizzerebbe la directory desktop. se si desidera che visualizzi la directory corrente con il nome del file corrente, è possibile digitare "% ~ dp0% ~ n0% ~ x0".


"% ~ dpnx0" sarebbe meglio
FrinkTheBrave il
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.