2009-03-11 6 views
168

Je veux obtenir le nom du fichier de traitement en cours sans l'extension de fichier.Quelle est la meilleure façon de faire une sous-chaîne dans un fichier batch?

Merci à this link, j'ai le nom de fichier avec l'extension ... mais quelle est la meilleure façon de faire une sous-chaîne dans un fichier batch?

Ou existe-t-il un autre moyen d'obtenir le nom de fichier sans l'extension?

Il est prudent de supposer que les extensions de 3 lettres sont dans ce scénario.

Répondre

346

Eh bien, pour obtenir le nom de fichier de votre lot, le plus simple serait d'utiliser %~n0.

@echo %~n0 

Affichera le nom (sans l'extension) du fichier de commandes en cours d'exécution (sauf exécuté dans un sous-programme appelé par call). La liste complète de ces substitutions « spéciales » pour les noms de chemin peut être trouvé avec help for, à la fin de l'aide:

En outre, la substitution des références POUR variables a été amélioré. Vous pouvez maintenant utiliser l'option syntaxe suivante:

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

Les modificateurs peuvent être combinés pour obtenir résultats composés:

%~dpI  - expands %I to a drive letter and path only 
%~nxI  - expands %I to a file name and extension only 
%~fsI  - expands %I to a full path name with short names only 

Pour répondre précisément à votre question, cependant: Les sous-chaînes sont faites à l'aide la notation :~start,length:

%var:~10,5% 

va extraire 5 caractères de la position 10 dans la variable d'environnement %var%.

NOTE: L'indice des chaînes est basée zéro, le premier caractère est à la position 0, la seconde à 1, etc.

Pour obtenir des sous-chaînes de variables d'arguments tels que %0, %1, etc. . vous devez les assigner à une variable d'environnement normal à l'aide set premier:

:: Does not work: 
@echo %1:~10,5 

:: Assign argument to local variable first: 
set var=%1 
@echo %var:~10,5% 

La syntaxe est encore plus puissant:

  • %var:~-7% extrait les 7 derniers caractères de %var%
  • %var:~0,-4% va extraire tous les caractères sauf les quatre derniers qui aussi vous débarrasser de l'extension du fichier (en supposant trois caractères après la période [.]).

Voir help set pour plus de détails sur cette syntaxe.

+0

Voilà une excellente réponse. Merci beaucoup. – JosephStyons

+0

Eh bien, ce sont maintenant trois réponses roulées en un ou deux, grâce à Patrick :) – Joey

+18

L'extraction de sous-chaîne ne fonctionne pas avec les variables de boucle FOR, donc vous devrez faire comme suit (\ r \ n dans la ligne moyenne du code interruptions car SO ne semble pas autoriser les sauts de ligne dans les commentaires): 'setlocal ENABLEDELAYEDEXPANSION \ r \ n pour/f %% s dans ('set') do ( \t set tmp = %% s \ r \ n \t echo! Tmp: ~ -3! \ R \ n ) ' – Fr0sT

26

Bien expliqué ci-dessus!

Pour tous ceux qui souffrent comme moi d'obtenir ce travail dans un environnement Windows localisé (le mien est XP en slovaque), vous pouvez essayer de remplacer le % avec un !

Alors:

SET TEXT=Hello World 
SET SUBSTRING=!TEXT:~3,5! 
ECHO !SUBSTRING! 
+18

Notez que cela ne fonctionnera qu'après la commande setlocal ENABLEDELAYEDEXPANSION' – Fr0sT

+0

Ou si vous appelez la ligne de commande avec/V, à savoir 'cmd/v' – Omertron

11

Comme une information supplémentaire à la réponse de Joey, qui n'est pas décrite à l'aide de set /? ni for /?.

%~0 se développe au nom du lot propre, exactement comme il a été tapé.
Donc, si vous démarrez votre lot il sera étendu comme

%~0 - mYbAtCh 
%~n0 - mybatch 
%~nx0 - mybatch.bat 

Mais il y a une exception, l'expansion dans un sous-programme pourrait échouer

echo main- %~0 
call :myFunction 
exit /b 

:myFunction 
echo func - %~0 
echo func - %~n0 
exit /b 

Il en résulte à

main - myBatch 
Func - :myFunction 
func - mybatch 

Dans une fonction %~0 se développe toujours au nom de la fonction, pas du fichier de commandes.
Mais si vous utilisez au moins un modificateur, il affichera à nouveau le nom du fichier!

Questions connexes