test12121
Goto Top

Batch For-Schleife Tokens

Hallo zusammen,

ich möchte aus dem Namen eines Ordners zwei neue Ordner anlegen. Der Name des Quellordners ist wie folgt aufgebaut:

"Test_Datum_Beschreibung"

Wichtig dabei zu wissen ist, dass innerhalb der "Beschreibung" auch Unterstriche vorkommen können.

Der neue Ordnerpfad der angelegt werden soll sieht wie folgt aus:

C:\Test\Datum_Beschreibung\

Mein bisheriger Code in Batch ist folgender:

for /d %%c in ("%%b\*") do (  
	for /f "tokens=1,2,3 delims=_" %%d in ("%%~nc") do (   
		for /f "delims=" %%i in ('dir /b /s /a-d "%%b\%%~nxc\*.txt"') do (    
			if not exist "%ziel%\%%d" md "%ziel%\%%d" >nul   
			if not exist "%ziel%\%%d\%%e_%%f" md "%ziel%\%%d\%%e_%%f" >nul 	  
			move "%%i" "%ziel%\%%d\%%e_%%f\"  
		)
	)
)

Das Problem dabei ist, dass wenn die Beschreibung zum Beispiel wie folgt aussieht: "Max_Mustermann" wird nur "Max übernommen.

Gibt es eine Möglichkeit einfach den ganzen Rest des Ordnernamens in eine Variable zu packen?

Content-ID: 668947

Url: https://administrator.de/contentid/668947

Ausgedruckt am: 25.10.2024 um 23:10 Uhr

150704
Lösung 150704 23.10.2024 aktualisiert um 10:38:51 Uhr
Goto Top
"tokens=1,2,* delims=_"
Dann wird nach dem ersten und zweiten getrennt, der Rest bleibt dann aber so wie er ist in der letzten Variablen. Es gibt dann drei Variablen %%d ist "Test" und %%e "Datum" und %%f "Beschreibung_mit_weiteren_Unterstrichen"

Tutorial zur FOR-Schleife
SPOK71
Lösung SPOK71 23.10.2024 um 10:35:45 Uhr
Goto Top
Moin,

ich bin nicht sicher aber ich glaube das Problem liegt in der Art und Weise, wie die tokens-Option im Batch-Skript verwendet wird. Mit tokens=1,2,3 wird der Name des Quellordners in genau drei Teile aufgeteilt, wobei der dritte Teil alles ab dem ersten Unterstrich in der "Beschreibung" abschneidet. Wenn mehr Unterstriche vorkommen, wird der Rest ignoriert.

Um sicherzustellen, dass der gesamte Rest des Ordnernamens in eine Variable gepackt wird, kannste tokens=1,2* verwenden. Das * sorgt dafür, dass der dritte Token alle verbleibenden Zeichen nach dem zweiten Unterstrich aufnimmt.

Der Code könnte so aussehen:

for /d %%c in ("%%b\*") do (  
    for /f "tokens=1,2* delims=_" %%d in ("%%~nc") do (  
        for /f "delims=" %%i in ('dir /b /s /a-d "%%b\%%~nxc\*.txt"') do (  
            if not exist "%ziel%\%%d" md "%ziel%\%%d" >nul  
            if not exist "%ziel%\%%d\%%e_%%f" md "%ziel%\%%d\%%e_%%f" >nul  
            move "%%i" "%ziel%\%%d\%%e_%%f\"  
        )
    )
)

folgendes habe ich hier geändert:

Die Zeile for /f "tokens=1,2,3 delims=_" %%d in ("%%~nc") do wurde zu for /f "tokens=1,2* delims=_" %%d in ("%%~nc") do geändert.

Das * am Ende sorgt dafür, dass %%f den gesamten Rest des Namens aufnimmt, unabhängig von zusätzlichen Unterstrichen.

Ich hoffe das hilft.
Test12121
Test12121 23.10.2024 um 10:56:29 Uhr
Goto Top
Perfekt, danke für eure Hilfe!