Ich habe ein Verzeichnis mit einer Reihe von Unterordnern, die einem Namensmuster entsprechen, wie:
sub-123
sub-0815
sub-4711
In diesen Ordnern habe ich einige Dateien mit der gleichen Nummer im Namen, wie sie im Ordnernamen gefunden wurde. Beispielsweise enthält der Ordner sub-123 die Dateien
input-123
output-123
Ich möchte den Ordner iterieren, das Arbeitsverzeichnis in den aktuellen Ordner ändern und einige Verarbeitungen mit dem entsprechenden Satz von Dateien durchführen. Während ich die Ordner iterieren kann mit
for /d %%d in (sub-*) do .
Ich brauche den Teil des Ordnernamens, der mit dem Sternchen übereinstimmt, im obigen Beispiel also "123". Wie kann ich die 123 aus dem Ordnernamen extrahieren und einen Befehl wie diesen erstellen?
cd sub-123
copy input-123 output-123
in einer Windows-7-Batchdatei? In der Linux-Umgebung könnte es möglich sein, den Befehl „cut“ oder einen beliebigen regulären Ausdruck zu verwenden. Aber wie gehe ich in der Windows-Eingabeaufforderung vor?
Antwort1
Ich habe es selbst gefunden. Der Set-Befehl hat eine erweiterte Variablensubstitution. Diese kann aber nicht im for
Body selbst verwendet werden. Es ist notwendig, einen neuen Bacth-Aufrufkontext zu starten:
for /d %%d in (sub-*) do (
set item=%%d
pushd %%d
call :build
popd
)
goto :eof
:build
set item=%item:sub-=%
copy input-%item% output-%item%
:eof
Das „Element“ wird nicht exakt aus der Zeichenfolge erstellt, die mit dem Sternchen übereinstimmt, ist aber gleichwertig.
Antwort2
Ich habe auch eine direkte Antwort gefunden. Sie liegt nah an der Cut-Semantik.
Der Befehl set hat auch eine Teilzeichenfolgensyntax. Um n Zeichen zu überspringen, verwenden Sie %variable:~n%
. Um n Zeichen ab Offset k zu erhalten, verwenden Sie%variable:~k,n%
for /d %%d in (sub-*) do (
set item=%%d
set num=%item:~4%
pushd %%d
copy input-%num% output-%num%
popd
)