Un fichier de commandes Windows peut-il déterminer son propre nom de fichier?

121

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"?

Djangofan
la source
1
%0est ce que vous recherchez. Voir [cette question] [1] pour en savoir plus. [1]: stackoverflow.com/questions/357315/…
Jonathon Reinhart
2
Oui, c'était ce que je cherchais. % ~ nx0 est la réponse.
djangofan

Réponses:

160

Oui.

Utilisez la %0variable spéciale pour obtenir le chemin d'accès au fichier actuel.

Écrivez %~n0pour obtenir uniquement le nom de fichier sans l'extension.

Écrivez %~n0%~x0pour obtenir le nom de fichier et l'extension.

Également possible d'écrire %~nx0pour obtenir le nom de fichier et l'extension.

SLaks
la source
1
C'est tout simplement inexact. % 0 et% ~ n0 n'obtiennent que la partie du nom de fichier. La réponse de @djangofan est correcte.
JustJeff
5
% 0 renvoie la manière dont le fichier a été appelé. Si un chemin complet a été utilisé,% 0 l'aura. Si vous accédez d'abord cdau 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)
Gogowitsch
@gogowitsch: Êtes-vous sûr? Je ne pense pas que ce soit vrai.
SLaks
Sur Win2012, %cd%renvoie le répertoire actuel du processus qui a appelé le fichier de commandes. Donc, si vous êtes à une invite d' D:\dir1entrée et entrez Y:\foo\bar.bat, si bar.bata, @echo %cd%il sortira D:\dir1.
Preacher
48

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, %~nx0vous donne "foo.bat", tandis que %~dpnx0donne "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"

JustJeff
la source
3
Dans votre bloc de code, vous indiquez qu'il fs'agit du nom de fichier, mais dans vos exemples, vous utilisez npour le nom de fichier. Après quelques tests, il semble que ce fsoit le chemin complet et nle nom du fichier.
Drew Chapin
@druciferre, j'ai édité la réponse en fonction de votre commentaire
robotik
"Si tu deviens mignon et essaie %~xnpd0" ... Je t'aime.
Mark Deven
32

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.

Djangofan
la source
9

Gardez à l'esprit qu'il 0s'agit d'un cas particulier de numéros de paramètres dans un fichier de commandes, où 0signifie 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 %0ou %~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. %~0supprime 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 %~0est 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
Jool
la source
3

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
Cary
la source
0

Voici mon code initial:

@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.

Ma preuve:

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

Voici le code final

@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
Fred Tusing
la source