Batch: Ordnernamen der obersten Ebene als Variable festlegen

Batch: Ordnernamen der obersten Ebene als Variable festlegen

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%

Bildschirmfoto

wobei die knownfileUmgebungsvariable der vollständige Pfad ohne Anführungszeichen ist. Sie müssen für diese Lösung weder die verzögerte Erweiterung aktivieren noch die CDUmgebungsvariable ändern.

Mit for /Rdurchlaufen Sie einen Verzeichnisbaum, während for /Fmit lediglich die Verarbeitung einer Zeichenfolge und deren Aufteilung an den \Zeichen erfolgt.

tokens=1weist 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,3und dannset prev=.\%%G\%%H\%%I

Wenn Sie den Laufwerksbuchstaben abrufen möchten, .\können Sie statt verwenden:set prev=%%~dG\%%~G

Weiterführende Literatur:

verwandte Informationen