Un fichier de commandes Windows peut-il déterminer son propre nom de fichier?
Par exemple, si j'exécute le fichier de commandes C: \ Temp \ myScript.bat, existe-t-il une commande dans myScript.bat qui peut déterminer la chaîne "myScript.bat"?
Un fichier de commandes Windows peut-il déterminer son propre nom de fichier?
Par exemple, si j'exécute le fichier de commandes C: \ Temp \ myScript.bat, existe-t-il une commande dans myScript.bat qui peut déterminer la chaîne "myScript.bat"?
Réponses:
Oui.
Utilisez la %0
variable spéciale pour obtenir le chemin d'accès au fichier actuel.
Écrivez %~n0
pour obtenir uniquement le nom de fichier sans l'extension.
Écrivez %~n0%~x0
pour obtenir le nom de fichier et l'extension.
Également possible d'écrire %~nx0
pour obtenir le nom de fichier et l'extension.
cd
au répertoire et exécutez le lot à partir de là,% 0 n'aura généralement pas les informations de chemin (mais vous pouvez l'obtenir à partir de% cd% dans ce cas)
%cd%
renvoie le répertoire actuel du processus qui a appelé le fichier de commandes. Donc, si vous êtes à une invite d' D:\dir1
entrée et entrez Y:\foo\bar.bat
, si bar.bat
a, @echo %cd%
il sortira D:\dir1
.
Vous pouvez obtenir le nom du fichier, mais vous pouvez également obtenir le chemin d'accès complet, en fonction de ce que vous placez entre le «% ~» et le «0». Faites votre choix
d -- drive
p -- path
n -- file name
x -- extension
f -- full path
Par exemple, de l'intérieur de c: \ tmp \ foo.bat, %~nx0
vous donne "foo.bat", tandis que %~dpnx0
donne "c: \ tmp \ foo.bat". Notez que les pièces sont toujours assemblées dans l'ordre canonique, donc si vous devenez mignon et essayez %~xnpd0
, vous obtenez toujours "c: \ tmp \ foo.bat"
f
s'agit du nom de fichier, mais dans vos exemples, vous utilisez n
pour le nom de fichier. Après quelques tests, il semble que ce f
soit le chemin complet et n
le nom du fichier.
%~xnpd0
" ... Je t'aime.
En utilisant le script suivant, basé sur la réponse SLaks, j'ai déterminé que la bonne réponse est:
echo The name of this file is: %~n0%~x0
echo The name of this file is: %~nx0
Et voici mon script de test:
@echo off
echo %0
echo %~0
echo %n0
echo %x0
echo %~n0
echo %dp0
echo %~dp0
pause
Ce que je trouve intéressant, c'est que % nx0 ne fonctionnera pas, étant donné que nous savons que le caractère «~» est généralement utilisé pour supprimer / couper les guillemets d'une variable.
Gardez à l'esprit qu'il 0
s'agit d'un cas particulier de numéros de paramètres dans un fichier de commandes, où 0
signifie ce fichier tel qu'il est indiqué sur la ligne de commande .
Donc, si le fichier est myfile.bat, vous pouvez l'appeler de plusieurs manières comme suit, chacune vous donnant une sortie différente de l' utilisation de %0
ou %~0
:
myfile
myfile.bat
mydir\myfile.bat
c:\mydir\myfile.bat
"c:\mydir\myfile.bat"
Tous les appels ci-dessus sont des appels légaux si vous l'appelez du bon endroit relatif au répertoire dans lequel il existe. %~0
supprime les citations du dernier exemple, alors que%0
n'est pas le cas.
Parce que tout cela donne des résultats différents %0
et qu'il %~0
est très peu probable que ce soit ce que vous voulez réellement utiliser.
Voici un fichier batch pour illustrer:
@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
Essayez d'exécuter l'exemple ci-dessous afin de ressentir le fonctionnement des variables magiques.
@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
Les règles associées sont les suivantes.
%~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.
J'ai remarqué que le nom de fichier donné par% ~ 0 et% 0 est la façon dont il a été entré dans le shell de commande et non comment ce fichier est réellement nommé. Donc, si vous voulez que la casse littérale soit utilisée pour le nom de fichier, vous devez utiliser% ~ n0. Cependant, cela laissera de côté l'extension de fichier. Mais si vous connaissez le nom du fichier, vous pouvez ajouter le code suivant.
set b=%~0
echo %~n0%b:~8,4%
J'ai appris que ": ~ 8,4%" signifie commencer au 9ème caractère de la variable, puis afficher les 4 caractères suivants. La plage est comprise entre 0 et la fin de la chaîne variable. Donc% Path% serait très long!
fIlEnAmE.bat
012345678901
Cependant, ce n'est pas aussi valable que la solution de Jool (% ~ x0) ci-dessus.
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
est ce que vous recherchez. Voir [cette question] [1] pour en savoir plus. [1]: stackoverflow.com/questions/357315/…