2009-03-11 5 views
168

Ich möchte den Namen der aktuell laufenden Batch-Datei ohne die Dateierweiterung abrufen.Was ist der beste Weg, um einen Teilstring in einer Batch-Datei zu machen?

Dank this link habe ich den Dateinamen mit die Erweiterung ... aber was ist der beste Weg, um einen Teilstring in einer Batch-Datei zu tun?

Oder gibt es eine andere Möglichkeit, den Dateinamen ohne die Erweiterung zu erhalten?

In diesem Szenario kann von 3-Buchstaben-Erweiterungen ausgegangen werden.

Antwort

346

Nun, um nur den Dateinamen Ihrer Charge zu erhalten, wäre der einfachste Weg, einfach %~n0 zu verwenden.

@echo %~n0 

ausgeben wird der Name (ohne die Erweiterung) des gerade laufenden Batch-Datei (es sei denn, durch call genannt in einem Unterprogramm ausgeführt).

erweitert

Zusätzlich Substitution von FOR Variablenreferenzen wurde: Die vollständige Liste dieser „speziellen“ Ersetzungen für Pfadnamen können mit help for, ganz am Ende der Hilfe. Sie können nun die folgenden optionalen Syntax:

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

Die Modifikatoren kombiniert werden können Verbindung Ergebnisse zu erhalten:

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

genau auf Ihre Frage zu beantworten, aber: Substrings sind fertig mit die :~start,length notation:

%var:~10,5% 

extrahiert 5 Zeichen von Position 10 in der Umgebungsvariablen %var%.

HINWEIS: Der Index der Saiten wird Null basiert, so dass das erste Zeichen an der Position 0, der zweite bei 1 usw.

Um Teilargumentations Variablen wie %0, %1, etc zu erhalten . Sie müssen sie zu einer normalen Umgebungsvariable zuweisen mit set zuerst:

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

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

Die Syntax ist noch leistungsfähiger:

  • %var:~-7% extrahiert die letzten 7 Zeichen von %var%
  • %var:~0,-4% würden alle Zeichen mit Ausnahme der letzten vier extrahieren, die auch Sie von der Dateierweiterung befreien würde (vorausgesetzt, drei Zeichen nach der Periode [.]).

Weitere Informationen zu dieser Syntax finden Sie unter help set.

+0

Das ist eine großartige, gründliche Antwort. Danke vielmals. – JosephStyons

+0

Nun, das sind jetzt drei Antworten in eine oder so gerollt, dank Patrick :) – Joey

+18

Substring Extraktion arbeitet nicht mit FOR-Schleife Variablen entweder Sie müssen also wie folgt tun (\ r \ n in der Code-Linie bricht ab, weil SO keine Zeilenumbrüche in Kommentaren zulässt): setlocal ENABLEDELAYEDEXPANSION \ r \ n für/f %% s in ('set') do (\ r \ n \t set tmp = %% s \ r \ n \t echo! Tmp: ~ -3! \ R \ n ) ' – Fr0sT

26

Schön oben erklärt!

Für alle, die wie ich leiden kann diese Arbeit in einem lokalisierten Windows zu bekommen (bei mir ist XP in Slowakisch), können Sie versuchen, die % mit einem !

So ersetzen:

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

Beachten Sie, dass dies nur nach dem Befehl 'setlocal ENABLEDELAYEDEXPANSION' funktioniert – Fr0sT

+0

Oder wenn Sie die Befehlszeile mit/V aufrufen, dh 'cmd/v' – Omertron

11

Als zusätzliche Information zu Joey's Antwort, die nicht in der Hilfe von set /? noch for /? beschrieben ist.

%~0 expandiert auf den Namen der eigenen Charge, genau wie sie eingegeben wurde.
Also, wenn Sie Ihre Batch-Start wird es als

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

erweitert werden, aber es gibt eine Ausnahme, in einem Unterprogramm erweitert

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

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

Dies führt zu

main - myBatch 
Func - :myFunction 
func - mybatch 
scheitern könnte In einer Funktion %~0 expandiert immer auf den Namen der Funktion, nicht der Batch-Datei.

Aber wenn Sie mindestens einen Modifikator verwenden, wird der Dateiname wieder angezeigt!

Verwandte Themen