
Umfeld:Windows 10
Frage:Wenn möglich – wie legen wir den Namen des obersten Ordners auf einem Laufwerk als Variable fest?
Wir erhalten von einem Drittanbieter eine CD mit Updates für ein von uns verwendetes System. Auf der CD befindet sich ein Ordner mit dem Titel der aktuellen Version (z. B. blahblahSystemblah-2018October-finalblah
), der alle Daten dieser Version enthält. Nachdem wir die CD in das System eingelegt haben, verwenden wir Robocopy, um den Server mit den Änderungen zu aktualisieren. Anschließend werden Benutzer, die das System ausführen, vom Server aktualisiert. Unsere aktuellen Probleme bestehen darin, dass wir den Ordnernamen manuell festlegen müssen, da Robocopy (soweit ich weiß) in seiner Quelle kein Platzhalterzeichen verwenden kann. Der Ordnername ist an anderer Stelle wichtig, sodass wir sie nicht einfach dazu bringen können, den Inhalt direkt auf die CD zu kopieren. Im Idealfall möchten wir die Batchdatei nicht verschieben müssen, bevor wir sie ausführen (die Verwendung des aktuellen Verzeichnisses wäre einfach, aber wie gesagt: Der Ordnername ist wichtig und wir versuchen, manuelle Eingaben/Aufwände von Benutzern auf ein absolutes Minimum zu beschränken).
Der relevante Teil des Skripts würde folgendermaßen aussehen:
@echo off
for (however you can get the top folder name automatically) do (set VRSN=however)
robocopy "D:\VRSN" "C:\local\directory" /e /mir /r:0 /w:0 /log:"C:\log\directory.txt"
Das Beste, was ich dazu finden konnte, ist dieses Skriptstück, wobei „knownfile“ der Name einer Datei ist, die sich immer im Ordner befindet:
setlocal enabledelayedexpansion
cd /d "D:\"
for /R %%G in (knownfile) do (
set "var1=%%~dpG"
set "var1=!var1:%CD%=!"
if not "!var1!"=="!prev!" (
if "!var1!"=="\" (echo .\) else echo(!var1:~1,-1!
)
set "prev=!var1!"
)
-- aber dieses Skript spuckt mehr aus als nur den Ordner mit dieser bekannten Datei, und es schneidet auch das erste Zeichen des Ordnernamens ab. Ich gebe als Erster zu, dass ich die Syntax nicht ganz verstehe oder wo sie falsch läuft, also wenn mir jemand einen besseren Weg zeigen oder mir helfen könnte, den obigen Code zu verfeinern, umnurGeben Sie diesen Ordner zurück, das wäre sehr dankbar.
Antwort1
Sie können etwas so Einfaches verwenden wie:
@ECHO off
set knownfile=D:\Folder\File.txt
for /F "delims=\ tokens=2" %%G in ("%knownfile%") do (
set prev=.\%%G
)
ECHO %prev%
wobei die knownfile
Umgebungsvariable der vollständige Pfad ohne Anführungszeichen ist. Sie müssen für diese Lösung weder die verzögerte Erweiterung aktivieren noch die CD
Umgebungsvariable ändern.
Mit for /R
durchlaufen Sie einen Verzeichnisbaum, während for /F
mit lediglich die Verarbeitung einer Zeichenfolge und deren Aufteilung an den \
Zeichen erfolgt.
tokens=1
weist ihn an, den ersten Teil der Zeichenfolge zu verwenden. Wenn Sie danach alle Ordner verwenden möchten, können Sie dies tun, indem Sie tokens=1,2,3
und dannset prev=.\%%G\%%H\%%I
Wenn Sie den Laufwerksbuchstaben abrufen möchten, .\
können Sie statt verwenden:set prev=%%~dG\%%~G