viking
Goto Top

Mit cmd Datei Dateipaare (*.csv und *.xlsx) aus Ordner in andern Ordner verschieben

Hallo an die Experten,

Ich möchte mit einer CMD Datei aus einem definierten Verzeichnis Dateipaare in ein anderes Verzeichnis verschieben.
Unter Dateipaar verstehe ich zwei Dateien mit exakt gleichem Namen bis auf die Dateiendung.
Also in meinem Beispiel eine CSV Datei und eine Excel Datei.
Wenn nur eine Datei, egal welchen Typs im Quellpfad vorhanden, dann kein verschieben!
Der Quellpfad ist C:\Temp\Eingang\
Der Zielpfad ist C:\Temp\Verarbeitet\

Beispiel:
Quelle:
C:\Temp\Eingang\121.csv
C:\Temp\Eingang\121.xlsx
C:\Temp\Eingang\122.csv
C:\Temp\Eingang\123.csv
C:\Temp\Eingang\123.xlsx


Ziel soll dann sein, dass 121 und 123 in den Ordner C:\Temp\Verarbeitet\
verschobnen werden.
C:\Temp\Verarbeitet\121.csv
C:\Temp\Verarbeitet\121.xlsx
C:\Temp\Verarbeitet\123.csv
C:\Temp\Verarbeitet\123.xlsx


A) Schön wäre noch, wenn ein Zeitstempel (Zeitpunkt des Verschiebens) an dein Dateinamen angehängt wird.
B) Wenn ohne Zeitstempel, dann sollen die Dateien im Zielpfad hart überschrieben werden.

Mich würden beide Varianten A und B interessieren.

Vielen Dank für eure Unterstützung!
viking

Content-ID: 671769

Url: https://administrator.de/forum/mit-cmd-datei-dateipaare-csv-und-xlsx-aus-ordner-in-andern-ordner-verschieben-671769.html

Ausgedruckt am: 06.04.2025 um 07:04 Uhr

CamelCase
Lösung CamelCase 06.03.2025 um 08:16:00 Uhr
Goto Top
Moin,

In PowerShell:

Variante 1
$sourcePath = "C:\Temp\Eingang"  
$destinationPath = "C:\Temp\Verarbeitet"  

$csvFiles = Get-ChildItem -Path $sourcePath -Filter "*.csv" -File  

foreach ($csv in $csvFiles) {
    $xlsxPath = Join-Path $sourcePath ($csv.BaseName + ".xlsx")  
    
    if (Test-Path $xlsxPath) {
        $ts = Get-Date -Format "yyyy-MM-dd_HHmmss"  
        
        $destinationCsv = Join-Path $destinationPath ($baseName + "_" + $ts + ".csv")  
        $destinationXlsx = Join-Path $destinationPath ($baseName + "_" + $ts + ".xlsx")  
        
        Move-Item -Path $csv.FullName -Destination $destinationCsv
        Move-Item -Path $xlsxPath -Destination $destinationXlsx
    }
}

Variante 2

$sourcePath = "C:\Temp\Eingang"  
$destinationPath = "C:\Temp\Verarbeitet"  

$csvFiles = Get-ChildItem -Path $sourcePath -Filter "*.csv" -File  

foreach ($csv in $csvFiles) {
    $xlsxPath = Join-Path $sourcePath ($csv.BaseName + ".xlsx")  
    
    if (Test-Path $xlsxPath) {
        Move-Item -Path $csv.FullName -Destination $destinationPath -Force
        Move-Item -Path $xlsxPath -Destination $destinationPath -Force
    }
}
TK1987
Lösung TK1987 06.03.2025 aktualisiert um 08:31:29 Uhr
Goto Top
Moin,

@echo off

set "source=C:\Temp\Eingang"  
set "target=C:\Temp\Verarbeitet"  
for /f "Tokens=1,2 Delims=:" %%A in ('time /T') do set "timestamp=%date:~6,4%-%date:~3,2%-%date:~0,2%_%%A-%%B"  

for %%A in ("%source%\*.xlsx") do (  
  if exist "%%~dpnA.csv" (  
    move /Y "%%~A" "%target%\%%~nA_%timestamp%.xlsx"  
    move /Y "%%~dpnA.csv" "%target%\%%~nA_%timestamp%.csv"  
  )
)

Gruß Thomas
viking
viking 06.03.2025 um 18:16:33 Uhr
Goto Top
Hallo CamelCase,
Danke für Deine Powershellvorschläge

Ich hab gerade beide Varianten getestet.

Bei der ersten Variante wird der Dateiname nicht mitgegeben.
Er wird pro Aufruf nur ein Dateipaar verarbeitet, und in das Verzeichnis verschoben.
Die Dateinamen beginnen dann mit einem "_"gefolgt vom Datum Uhrzeit und der Dateiendung.


Die zweite Variante verarbeitet alle Dateipärchen im Verzeichnis in einem Lauf und verschiebt diese ins Zielverzeichnis, mit dem Dateinamen ohne Zeitstempel

Viele Grüße und vielen Dank !!!

viking
viking
viking 06.03.2025 um 18:21:02 Uhr
Goto Top
Hallo Thomas,

vielen Dank für Deine Lösung mit Zeitstempel.
Die funktioniert wunderbar

Viele Grüße

Erich