Un file batch di Windows può determinare il proprio nome file?


121

Un file batch di Windows può determinare il proprio nome file?

Ad esempio, se eseguo il file batch C: \ Temp \ myScript.bat, esiste un comando all'interno di myScript.bat che può determinare la stringa "myScript.bat"?


1
%0è quello che stai cercando. Vedi [questa domanda] [1] per ulteriori informazioni. [1]: stackoverflow.com/questions/357315/…
Jonathon Reinhart

2
Sì, era quello che stavo cercando. % ~ nx0 è la risposta.
Djangofan

Risposte:


160

Sì.

Usa la %0variabile speciale per ottenere il percorso del file corrente.

Scrivi %~n0per ottenere solo il nome del file senza l'estensione.

Scrivi %~n0%~x0per ottenere il nome del file e l'estensione.

È anche possibile scrivere %~nx0per ottenere il nome del file e l'estensione.


1
Questo è solo impreciso. Sia% 0 che% ~ n0 ottengono solo la parte del nome del file. La risposta di @djangofan è corretta.
JustJeff

5
% 0 restituisce il modo in cui è stato chiamato il file. Se è stato utilizzato un percorso completo,% 0 lo avrà. Se cd
entri prima nella directory

@gogowitsch: sei sicuro? Non credo sia vero.
SLaks

Su Win2012, %cd%restituirà la directory corrente del processo che ha chiamato il file batch. Quindi, se sei a un prompt D:\dir1e inserisci Y:\foo\bar.bat, se bar.batha @echo %cd%, verrà visualizzato D:\dir1.
Predicatore

48

È possibile ottenere il nome del file, ma è anche possibile ottenere il percorso completo, a seconda di cosa si inserisce tra "% ~" e "0". Scegli tra

d -- drive
p -- path
n -- file name
x -- extension
f -- full path

Ad esempio, dall'interno di c: \ tmp \ foo.bat, %~nx0ti dà "foo.bat", mentre ti %~dpnx0dà "c: \ tmp \ foo.bat". Nota che i pezzi sono sempre assemblati in ordine canonico, quindi se diventi carino e provi %~xnpd0, ottieni comunque "c: \ tmp \ foo.bat"


3
Nel blocco di codice, dichiari che fè il nome del file, ma nei tuoi esempi lo usi nper il nome del file. Dopo alcuni test, sembra che fsia il percorso completo e nil nome del file.
Drew Chapin

@druciferre, ho modificato la risposta in base al tuo commento
robotik

"Se diventi carino e provi %~xnpd0" ... ti amo.
Mark Deven

32

Utilizzando il seguente script, basato sulla risposta SLaks, ho determinato che la risposta corretta è:

echo The name of this file is: %~n0%~x0
echo The name of this file is: %~nx0

Ed ecco il mio script di prova:

@echo off
echo %0
echo %~0
echo %n0
echo %x0
echo %~n0
echo %dp0
echo %~dp0
pause

Quello che trovo interessante è che % nx0 non funzionerà, dato che sappiamo che il carattere '~' di solito è usato per rimuovere / tagliare le virgolette da una variabile.


9

Tieni presente che 0è un caso speciale di numeri di parametro all'interno di un file batch, dove 0significa che questo file è dato sulla riga di comando .

Quindi, se il file è myfile.bat, puoi chiamarlo in diversi modi come segue, ognuno dei quali ti darebbe un output diverso dall'uso %0o %~0:

myfile

myfile.bat

mydir\myfile.bat

c:\mydir\myfile.bat

"c:\mydir\myfile.bat"

Tutte le precedenti sono chiamate legali se lo chiami dalla posizione relativa corretta alla directory in cui esiste. %~0rimuove le virgolette dall'ultimo esempio, mentre %0non lo fa.

Perché danno tutti risultati diversi %0 ed %~0è molto improbabile che siano ciò che si desidera effettivamente utilizzare.

Ecco un file batch per illustrare:

@echo Full path and filename: %~f0
@echo Drive: %~d0
@echo Path: %~p0
@echo Drive and path: %~dp0
@echo Filename without extension: %~n0
@echo Filename with    extension: %~nx0
@echo Extension: %~x0
@echo Filename as given on command line: %0
@echo Filename as given on command line minus quotes: %~0
@REM Build from parts
@SETLOCAL
@SET drv=%~d0
@SET pth=%~p0
@SET fpath=%~dp0
@SET fname=%~n0
@SET ext=%~x0
@echo Simply Constructed name: %fpath%%fname%%ext%
@echo Fully  Constructed name: %drv%%pth%%fname%%ext%
@ENDLOCAL
pause

3

Prova a eseguire l'esempio di seguito per sentire come funzionano le variabili magiche.

@echo off

SETLOCAL EnableDelayedExpansion

echo Full path and filename: %~f0
echo Drive: %~d0
echo Path: %~p0
echo Drive and path: %~dp0
echo Filename without extension: %~n0
echo Filename with    extension: %~nx0
echo Extension: %~x0

echo date time : %~t0
echo file size: %~z0

ENDLOCAL

Le relative regole stanno seguendo.

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

0

Di seguito è riportato il mio codice iniziale:

@echo off
Set z=%%
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.

Ho notato che il nome del file dato da% ~ 0 e% 0 è il modo in cui è stato inserito nella shell dei comandi e non il modo in cui il file è effettivamente denominato. Quindi, se si desidera utilizzare il caso letterale per il nome del file, è necessario utilizzare% ~ n0. Tuttavia, questo tralascia l'estensione del file. Ma se conosci il nome del file potresti aggiungere il seguente codice.

set b=%~0
echo %~n0%b:~8,4%

Ho imparato che ": ~ 8,4%" significa iniziare dal nono carattere della variabile e quindi mostrare mostra i successivi 4 caratteri. L'intervallo è compreso tra 0 e la fine della stringa variabile. Quindi% Path% sarebbe molto lungo!

fIlEnAmE.bat
012345678901

Tuttavia, questo non è valido come la soluzione di Jool (% ~ x0) sopra.

La mia prova:

C:\bin>filename.bat

%0.......filename.bat
%~0......filename.bat
. . .

C:\bin>fIlEnAmE.bat

%0.......fIlEnAmE.bat
%~0......fIlEnAmE.bat
%n0......n0
%x0......x0
%~n0.....FileName
%dp0.....dp0
%~dp0....C:\bin\

%~n0%b:~8,4%...FileName.bat

Press any key to continue . . .

C:\bin>dir
 Volume in drive C has no label.
 Volume Serial Number is CE18-5BD0

 Directory of C:\bin
. . .
05/02/2018  11:22 PM               208 FileName.bat

Ecco il codice finale

@echo off
Set z=%%
set b=%~0
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.
echo A complex solution:
echo ===================================
echo %z%~n0%z%b:~8,4%z%...%~n0%b:~8,4%
echo ===================================
echo.
echo The preferred solution:
echo ===================================
echo %z%~n0%z%~x0.......%~n0%~x0
echo ===================================
pause
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.