tfoal01
Goto Top

Batchdatei um Dateien in neuen Ordner zu kopieren und umzubenennen

Hallo zusammen,

wir haben folgendes Problem:
Wir sind ein kleines Hörbuchstudio. Unsere Aufnahmen werden nach dem Schneiden und Bearbeiten noch einmal komplett von einer Person gegengehört (Proof Listening). Dieses Proof Listening soll über einen Audio Player laufen, der Bookmarks für die abzuhörenden MP3 Files erstellt und diese in einer Datei speichert.
Nun haben wir einen sehr komfortablen Player gefunden, allerdings speichert dieser 1. für jede MP3 File mit Bookmark eine einzelne Datei und 2. wird diese Datei dann im Format *.pbt gespeichert (Bookmark-Format vom Player).
Diese *.pbt Dateien sind am Ende allerdings nur anders benannte *.txt Dateien.

Nun haben wir folgendes vor:
Wir benötigen (am besten) eine Batch-Datei, die in dem Ordner, in dem sie abgelegt wird, einen neuen Ordner erstellt, alle Dateien mit der Endung *.pbt dort hin kopiert und diese in *.txt umbenennt.
Großartig wäre noch, wenn er diese erstellten *.txt Dateien am Ende zu einer großen *.txt Datei zusammenfassen kann und (im noch allerbesten Fall) in diesem neunen Dokument vor dem Inhalt jeder txt Datei noch den Namen der jeweiligen Datei darüber schreiben kann.

Ist so etwas möglich oder benötigt man hier mehrere Schritte ... oder geht das vielleicht gar nicht über Batch?

Viele Grüße

Content-ID: 670073

Url: https://administrator.de/forum/batchdatei-um-dateien-in-neuen-ordner-zu-kopieren-und-umzubenennen-670073.html

Ausgedruckt am: 15.01.2025 um 13:01 Uhr

Globetrotter
Globetrotter 09.12.2024 um 20:32:24 Uhr
Goto Top
Hi..
Poste das mal unter "Powershell" - mein Tip!
.. Workflow bitte nochmals genau nachgehen...

Gruss Globe!
kpunkt
kpunkt 10.12.2024 aktualisiert um 06:51:46 Uhr
Goto Top
Hm...für eine Batchdatei
for %%f in (*.pbt) do (echo --- %%f --- & type "%%f" & echo.) >> gesamt.txt  

Kopiert soll auch werden. Dann mal scriptig in der Batch
@echo off
setlocal enabledelayedexpansion

set "output_file=gesamt.txt"  
set "output_dir=%~dp0%output_file:~0,-4%"  

if exist "%output_file%" del "%output_file%"  
if not exist "%output_dir%" mkdir "%output_dir%"  

for %%F in (*.pbt) do (
    if not "%%F"=="%output_file%" (  
        echo --- %%F --- >> "%output_file%"  
        type "%%F" >> "%output_file%"  
        echo. >> "%output_file%"  
        
    )
)

move "%output_file%" "%output_dir%"  
echo Kombinierte Datei wurde erstellt und in %output_dir% verschoben.
TK1987
TK1987 10.12.2024 aktualisiert um 11:57:07 Uhr
Goto Top
Moin,

Zitat von @tfoal01:
[...] eine Batch-Datei, die in dem Ordner, in dem sie abgelegt wird [...]
das solltest du überdenken. Aus Erfahrung führt das gerade in einem Fall wie diesem dazu, dass die Batch später dutzende male in verschiedenen Ordnern existiert. Im schlimmsten Falle wurde sie noch weiter fortgeschrieben und existiert in den verschiedensten Versionen.

Besser ist immer den jeweiligen Ordnerpfad als Parameter an das Skript zu übergeben. Zudem ist es so auch möglich, gleich mehrere verschiedene Projektordner auf einmal verarbeiten zu lassen.

Für die Übergabe des Ordners an das Skript gibt es diverse Möglichkeiten:

  • Verknüpfung zum Skript in den Ordner "%appdata%\Microsoft\Windows\SendTo" legen. Fortan kann man dann einfach auf einen Ordner per Rechtsklick "Senden an > <Skriptname>" auswählen, um das Skript zu starten.
  • Per eigenem Kontextmenüeintrag
  • Ordner per Drag&Drop auf das Skript ziehen
  • ...

@echo off

set outdir=Transkript
set outfile=Gesamt.txt

:: Für jeden Parameter: Wenn Ordner, an Funktion übergeben. Sonst Fehlermeldung und ignorieren.
for %%A in (%*) do 2>nul pushd "%%~A" &&(popd & call :mergeTranscript "%%~A") || (echo(ACHTUNG: "%%~nxA" ist kein Ordner und wird ignoriert.&set stop=true)  

if defined stop (
  echo(
  echo(|set /p ="---   Beliebige Taste zum Beenden   --- "  
  >nul pause
)

exit /b 0
:mergeTranscript <dir>
  if not exist "%~1\%outdir%" md "%~1\%outdir%"  
  >"%~1\%outdir%\%outfile%" (for %%A in ("%~1\*.pbt") do (  
    echo(--- %%~nxA ---
    type "%%~A"  
    echo(
  ))
  exit /b 0

Alternativ über Powershell (weil Batch eigentlich tot):
$outdir  = "Transkript"  
$outfile = "Gesamt.txt"  

foreach ($arg in $args) {
  if (!(Test-Path -PathType Container -Path $arg)) {
    Write-Host -ForegroundColor yellow "ACHTUNG: ""$arg"" ist kein Ordner und wird ignoriert."  
    $stop = 1
    continue
  }
  if (!(Test-Path "$arg\$outdir")) {[void](md "$arg\$outdir")}  
  $(foreach ($file in Get-ChildItem "$arg\*.pbt") {  
    "--- {0} ---" -f $file.Name  
    Get-Content $file
    ""  
  }) | Set-Content "$arg\$outdir\$outfile"  
}

if ($stop) {
  Write-Host -ForegroundColor yellow -NoNewLine "`n---   Beliebige Taste zum Beenden   --- "  
  [void][console]::ReadKey($true)
}

Bei Powershell darf das Verknüpfungsziel dann allerdings nicht nur der Skriptpfad sein, sondern
powershell.exe -File "<Skriptpfad>"  

Gruß Thomas