2016-03-30 8 views
1

Ich habe eine ganze Weile ohne Glück gesucht, um mein Skript zum Laufen zu bringen. Ich fühle mich, als wäre ich ziemlich nah dran, brauche aber ein wenig Hilfe. Ich versuche eine FOR-Schleife zu verwenden, um "srcdir" (am Anfang meines Skripts) rekursiv zu scannen, und sobald die Schleife Dateien/Pfade (%% f) zurückgibt, kann ich einen Teil des Dateipfads durch etwas anderes ersetzen (zB; C: \ rootpath \ src für C: \ rootpath \ des).Dateipfad im Stapel aufteilen mit For-Schleife und Variablensubstitution

Ich bin in der Lage, etwas wie dies zu tun, indem Sie ein Skript wie diese verwenden:

set subdir=C:\rootpath\src 
set subdir=%subdir:src=des% 
echo %subdir% 

jedoch, was dies schwierig macht, ist, dass der Root-Pfad meines „srcdir“ ändern kann (zB; C : \ roothpath) und alles rekursiv, nachdem sich das "srcdir" geändert hat (zB alles nach dem Ordner "src" in C: \ rootpath \ src). Die einzigen konstanten Pfade der Ordner src und der Ordner des (im selben Verzeichnis, in dem ich meine Batch-Datei ausführen).

Also, mit der gleichen Technik im vorherigen Beispiel, ich möchte eine FOR-Schleife rekursiv finden Sie den vollständigen Pfad der Dateien in "srcdir" (%% f) und ersetzen Sie den Ordner "src" mit der Ordner "des" in der Pfadzeichenfolge. Daher versuche ich "%% f" als Variable (Unterverzeichnis) zu setzen und die Ordner durch Variablensubstitution zu ersetzen.

Hier ist mein aktuelles nicht-verarbeitendes Script:

set srcdir=C:\rootpath\src 
for /r "%srcdir%" %%f in (*.txt) do (
set subdir=%%f 
set subdir=%subdir:src=des% 
echo %subdir% 
) 

Jede Hilfe wäre sehr dankbar! Vielen Dank!

+0

Sie werden [verzögerte Erweiterung] (http://ss64.com/nt/delayedexpansion.html) benötigen, sobald Sie Variablen innerhalb eines Codeblocks wie eine 'for' Schleife setzen und lesen ... – aschipfl

+0

also ich sollte "Setlocal EnableDelayedExpansion" vor dem Start der for-Schleife verwenden? –

+0

Ja, das ermöglicht es; Um es tatsächlich zu benutzen, müssen Sie Variablen wie '! variable!' statt '% variable%' expandieren; das gilt auch für die Substring-Substitutionssyntax ... – aschipfl

Antwort

2

Sie müssen delayed expansion aktivieren, da Sie zuweisen und Variablen innerhalb eines Blocks von Code wie ein for Schleife zu lesen:

setlocal EnableDelayedExpansion 
set "srcdir=C:\rootpath\src" 
for /R "%srcdir%" %%F in ("*.txt") do (
    set "subdir=%%~fF" 
    set "subdir=!subdir:\src\=\des\!" 
    echo(!subdir! 
) 
endlocal 

Der setlocal EnableDelayedExpansion Befehl ermöglicht die Erweiterung verzögert; es lokalisiert auch die Umgebung, was bedeutet, dass Änderungen an Umgebungsvariablen nur verfügbar sind, bevor endlocal ausgeführt wird oder die Batch-Datei beendet wird.

Um die verzögerte Erweiterung tatsächlich zu verwenden, müssen Sie die Prozentzeichen durch Ausrufezeichen ersetzen, sodass %subdir% zu !subdir! wird.

+0

Vielen Dank. Das macht viel mehr Sinn. Ich konnte das Skript zum Laufen bringen und die verzögerte Erweiterung besser verstehen. :) –