Batch-Prog. : zusammenfügen, umbenennen, ordner erstellen und in ordner verschieben

Obinobi

Cadet 4th Year
Registriert
Mai 2005
Beiträge
94
Hallo Leute,

bräuchte etwas Unterstützung von euch! Bei dem Batch-Code habe ich leider noch nicht so ganz den Durchblick.

Mein Batch-Programm soll folgendes können.

Ich habe zum Beispiel in einem Ordner in dem sich die Batch-File befindet folgende txt-Files:

1E01.txt
1E02.txt
1E03.txt
2E01.txt
2E02.txt

Ideal wäre es, wenn meine Batch jetzt erkennen würde, dass es 2 Serien gibt (also 1E0x und 2E0x). Dann soll jeweils für jede Serie ein Ordner erstellt werden (1E00 und 2E00). Zum Schluss soll dann in jedem Ordner eine zusammengefügte txt-file erstellt werden ( z.B. 1E01.txt + 1E02.txt + 1E03.txt >> 1E00.txt).

Bisher konnte ich folgenden Code zusammenschustern, der funktioniert leider nur (fast) für eine Serie:

For /F %%i in ('dir /b *.txt') do set Datei=%%~ni
set A="%Datei%"
set A=%A:~0,3%
echo %A%
set A=%A%00
type*.txt >> "%A%".txt
md %A%

->Das Programm erstellt mir dann schon mal einen zusammengefügte 2E00.txt und einen Ordner 2E00. Wenn sich dann die 2E00.txt noch in dem Ordner 2E00 befinden würde, wäre mir auch erstmal geholfen.

Vielen Dank, schon mal im voraus!!!
 
For /F %%i in ('dir /b *.txt') do set Datei=%%~ni

In diese Zeile kannst du schon mal nach Serie einschränken (hier für 1. Serie):
For /F %%i in ('dir /b 1*.txt') do set Datei=%%~ni

Wenn du allerdings beliebige Serien machen möchtest, dann müsstest du noch eine Schleife mit Zahlen von 1 bis 9 machen und den aktuellen Wert in der For-Schleife verwenden. Evtl. kannst du das auch einfach für jede Serie hinschreiben - umständlich, aber es funktioniert. Nähere Angaben zu den Serien wären noch hilfreich, um eine genauere Aussage machen zu können.

Und zum Schluss kannst du doch einfach die Datei verschieben
move "%A%".txt %A%

Ich habe es selbst nicht getestet. Es kann also sein, dass die Syntax etwas anders ist.
 
Alternativ kannst du das auch mit der Powershell realisieren:

Code:
$hashtable = @{}

$script_path = $MyInvocation.MyCommand.Path
$script_dir = Split-Path $script_path

$files = Get-ChildItem -File -Filter *.txt

$files | ForEach-Object {
	
	$length_filename = ($_.BaseName).length
	
	for ($i = 0; $i -lt $length_filename; $i++) {
		
		if (($_.BaseName).Substring($i,1) -eq "E") {
			
			$position_e = $i + 1
			
			$name = ($_.BaseName).Substring(0,$position_e)
			
			$filter = $name + "*"
			
			for ($j = $position_e; $j -lt $length_filename; $j++) {
			
				$name += "0"				
			}
			
			if (!$hashtable.Contains($name)) { $hashtable.Add($name, $filter) }
		}
	}
}

$hashtable.Keys | ForEach-Object { 
	
	$filter = $hashtable.Get_Item($_)
	$directory = $script_dir + "\" + $_
	$filename = $directory + "\" + $_ + ".txt"
	
	New-Item $directory -Type directory | Out-Null
	
	Get-ChildItem -Filter $filter -File | ForEach-Object { Move-Item $_.FullName -Destination $directory }

	Get-ChildItem $directory -File | ForEach-Object {
		
		$temp = Get-Content $_.FullName
		
		Add-Content -Path $filename -Value $temp
	}
}

Funktioniert für Dateien mit folgendem Namen: [1..n]E[1..n] und nur mit Powershell v3
 
Zurück
Oben