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"?
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"?
Risposte:
Sì.
Usa la %0
variabile speciale per ottenere il percorso del file corrente.
Scrivi %~n0
per ottenere solo il nome del file senza l'estensione.
Scrivi %~n0%~x0
per ottenere il nome del file e l'estensione.
È anche possibile scrivere %~nx0
per ottenere il nome del file e l'estensione.
cd
%cd%
restituirà la directory corrente del processo che ha chiamato il file batch. Quindi, se sei a un prompt D:\dir1
e inserisci Y:\foo\bar.bat
, se bar.bat
ha @echo %cd%
, verrà visualizzato D:\dir1
.
È 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, %~nx0
ti dà "foo.bat", mentre ti %~dpnx0
dà "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"
f
è il nome del file, ma nei tuoi esempi lo usi n
per il nome del file. Dopo alcuni test, sembra che f
sia il percorso completo e n
il nome del file.
%~xnpd0
" ... ti amo.
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.
Tieni presente che 0
è un caso speciale di numeri di parametro all'interno di un file batch, dove 0
significa 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 %0
o %~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. %~0
rimuove le virgolette dall'ultimo esempio, mentre %0
non 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
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
@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.
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
@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
%0
è quello che stai cercando. Vedi [questa domanda] [1] per ulteriori informazioni. [1]: stackoverflow.com/questions/357315/…