yellowcake
Goto Top

CDs Automatisch auf HDD kopieren

hey

ich stehe gerade etwas auf dem Schlauch.

ich habe hier ca 100-500 CD liegen mit Daten. Ich würde gerne jede CD auf die Festplatte 1 zu 1 kopieren ohne ständig irgend etwas am Rechner zu machen.

idealerweise so:

CD einlegen -> wird automatisch erkannt und dann wird gleich alles von der CD Kopiert in ein Laufwerk meiner wahl, nur immer wieder ein Ordner erstellt , egal ob vortlaufende nummer oder Datum+zeit. Wenn das Kopieren durch ist, wird die CD ausgeworfen und wird gewartet bis eine neue CD erkannt ist. dann gehts wieder von vorne los.

dachte in AutoIT könnte man das machen, aber hier stehe ich total auf dem schlauch...
ich weiß das man mit
Local $aCDRom = DriveGetDrive($DT_CDROM)
CDTray($aCDRom[1], $CDTRAY_OPEN)
die CD auswerfen kann.
ich weiß nur noch nicht wie ich das kopieren hin bekomme das immer ein neuer Ordner erstellt wird ...

Content-Key: 372904

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

Ausgedruckt am: 28.03.2024 um 15:03 Uhr

Mitglied: SlainteMhath
SlainteMhath 03.05.2018 um 16:29:16 Uhr
Goto Top
Moin,

also unter Linux würde ich das mit udev-rules machen, das geht da problemlos.
Und Windows... evtl. mit Powershell? Endlosschleife, die das Laufwerk überwacht, dann kopiert und auswirft und dann wieder wartet...

lg,
Slainte
Mitglied: Kraemer
Kraemer 03.05.2018 um 16:44:06 Uhr
Goto Top
Zitat von @SlainteMhath:
Und Windows... evtl. mit Powershell? Endlosschleife, die das Laufwerk überwacht, dann kopiert und auswirft und dann wieder wartet...
ist ne Idee
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
https://gallery.technet.microsoft.com/scriptcenter/EjectClose-CDDVD-driv ...
Mitglied: Yellowcake
Yellowcake 03.05.2018 um 16:55:32 Uhr
Goto Top
RunWait ("ROBOCOPY e:\ c:\temp\cd\%datum%.%zeit%")  
Local $aCDRom = DriveGetDrive($DT_CDROM)
CDTray($aCDRom[1], $CDTRAY_OPEN)

soweit bin ich schon ;) leider weiß ich noch nicht wie ich mit robocopy das datum da rein bekomme face-smile
Mitglied: colinardo
colinardo 03.05.2018, aktualisiert am 04.05.2018 um 11:31:00 Uhr
Goto Top
Servus Yellowcake,
das ist schnell gemacht.

Hier mal als Powershell-Skript:
(Variablen im Kopf füllen, starten, CDs einfach nacheinander einlegen, freuen face-smile)
<#
    AUTO COPY DISK ON INSERT
#>
# ==============
# drive letter to monitor
$drive = 'E:'  
# backup root folder
$target = 'D:\Backup'  
# =============
# only continue if PS >= Version 3.0
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}  
# create root folder if not exist
if (!(Test-Path $target)) {md $target -Force | out-null}

# delete eventcubscriber if there are still open ones
Get-EventSubscriber | Unregister-Event -Force
# shell object
$global:shell = New-Object -Com Shell.Application

# WMI Event Registration (Action fires when CD-Drive changes it's state)  
Register-WmiEvent -Query "Select * From __InstanceModificationEvent Within 1 where TargetInstance isa 'Win32_LogicalDisk' and TargetInstance.DriveType = 5 and TargetInstance.Size != null and TargetInstance.DeviceId = '$drive'" -SourceIdentifier 'RemovableDetector' -Action {  
    $deviceid = $Event.SourceEventArgs.NewEvent.TargetInstance.DeviceID
    $volserial = $Event.SourceEventArgs.NewEvent.TargetInstance.VolumeSerialNumber
    # create target subfolder with name format "disk_volumeserial_(datetime)"  
    $targetfolder = "$target\Disk_${volserial}_$(get-date -f yyyyMMdd-HHmmss)"  
    md $targetfolder -Force | out-null

    # list drive information
    write-host "New disk loaded." -F Green  
    write-host ($Event.SourceEventArgs.NewEvent.TargetInstance | select DeviceId, Description@{n='DiskSize';e={'{0:N2} MB' -f ($_.Size / 1MB)}} | ft -AutoSize | out-string)  
    
    write-host "Start copying disk to '$targetfolder' ... " -NoNewline -F Green  
    # copy to target
    copy-item "$deviceid\*" -Recurse -Destination $targetfolder -Force  
    # eject disk
    write-host "Finished. Ejecting disk '$deviceid' ..." -F Green  
    $global:shell.Namespace(17).ParseName($deviceid).Verbs() | ?{$_.Name.replace('&','') -match '^(Auswerfen|Eject)$'} | %{$_.Doit()}  
    write-host 'Waiting for next disk ...' -F Green  
} | out-null
cls
write-host 'Waiting for disk ...' -F Green  
while($true){sleep 1}
Grüße Uwe
Mitglied: Yellowcake
Yellowcake 04.05.2018 aktualisiert um 10:01:41 Uhr
Goto Top
danke colinardo, habe aber einen noch einfacheren weg gefunden:

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%  
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%  
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%  
set "myDate=%date:~6,4%%date:~3,2%%date:~0,2%"  

robocopy e:\ /E c:\temp\cd\%date:~6,4%.%date:~3,2%.%date:~0,2%-%hour:~0,2%.%min:~0,2%.%secs:~0,2%

powershell (New-Object -com "WMPlayer.OCX.7").cdromcollection.item(0).eject()  

c:\temp\cd\test.cmd

wobei
c:\temp\cd\test.cmd
die CMD Datei selber ist face-smile der loop für loser ;)

läuft super face-smile
Mitglied: Lochkartenstanzer
Lochkartenstanzer 04.05.2018 aktualisiert um 10:09:08 Uhr
Goto Top
Zitat von @Yellowcake:

wobei
c:\temp\cd\test.cmd
die CMD Datei selber ist face-smile der loop für loser ;)

läuft super face-smile

Stack overflow!!eins!elf!!! face-smile

lks

PS. Guck mal auf den Speicherverbrauch, Sollte zwar unkritisch sein, aber je nachdem, wieviele rekursive Aufrufe Du hast, könnte das schon zu Problemen führen.
Mitglied: Kraemer
Kraemer 04.05.2018 um 10:22:51 Uhr
Goto Top
Zitat von @Yellowcake:

danke colinardo, habe aber einen noch einfacheren weg gefunden:
Sorry, aber nein, das hast du nicht.

powershell (New-Object -com "WMPlayer.OCX.7").cdromcollection.item(0).eject()
wie man im Internet mehrfach lesen kann, die ätzendste "Lösung", um ein Laufwerk zu öffnen. Nur mal am Rande gefragt, weißt du genau, was diese Zeile macht?

wobei
c:\temp\cd\test.cmd
die CMD Datei selber ist face-smile der loop für loser ;)
nope - das ist keine Schleife! lks hat es schon richtig beschrieben!

läuft super face-smile
dein Elan in allen Ehren (und ich finde es wirklich gut, dass du trotz fertiger Lösung dir eine eigene gesucht hast), aber das was du da gebastelt hast, ist übelster Stil. Sowas kann echt "lustige" Nebeneffekte habe...

Gruß
Mitglied: colinardo
colinardo 04.05.2018 aktualisiert um 10:46:15 Uhr
Goto Top
Hust.":;*#@
Don't cry for me Argentina, it's friday.
Mitglied: Yellowcake
Yellowcake 04.05.2018 um 11:22:42 Uhr
Goto Top
Zitat von @Kraemer:
powershell (New-Object -com "WMPlayer.OCX.7").cdromcollection.item(0).eject()
wie man im Internet mehrfach lesen kann, die ätzendste "Lösung", um ein Laufwerk zu öffnen. Nur mal am Rande gefragt, weißt du genau, was diese Zeile macht?

nein ;) es macht aber das was es soll ;)

läuft super face-smile
dein Elan in allen Ehren (und ich finde es wirklich gut, dass du trotz fertiger Lösung dir eine eigene gesucht hast), aber das was du da gebastelt hast, ist übelster Stil. Sowas kann echt "lustige" Nebeneffekte habe...

;) übelster Stil ;) läuft würde ich sagen face-smile Von Powershell habe ich leider keine Ahnung und bei AutoIT wollte es auch nicht so wie ich, da musste ich wieder auf das gute alte CMD zurück, und dann dachte ich mir wieso nicht alles gleich ins CMD ;) ok holzhammer metode mit dem Loop für loser, aber im ganzen geht es ja.

aber ich versuche gerade auch die Powershell Lösung zu verstehen, steige aber noch nicht da hinter. und was nutzen was man nicht versteht ist ja auch doof...
Mitglied: colinardo
colinardo 04.05.2018 aktualisiert um 11:35:37 Uhr
Goto Top
aber ich versuche gerade auch die Powershell Lösung zu verstehen, steige aber noch nicht da hinter. und was nutzen was man nicht versteht ist ja auch doof...
Dafür habe ich doch extra alle Zeilen mit Kommentaren versehen face-smile?!

Wenn noch Fragen sind einfach fragen.

Machen lässt sich das mit fast allen Skript und Programmiersprachen. Vorgehensweise ist dabei immer ähnlich:
  • WMI Event (Win32_LogicalDisk) mit WQL für Laufwerk abonnieren (Das Event sagt dem Skript wann eine neue CD eingelegt wurde)
  • Dem Event die entsprechende Aktion zuweisen
Mitglied: colinardo
Lösung colinardo 04.05.2018 aktualisiert um 12:15:09 Uhr
Goto Top
Hier noch für die Auto-It Fraktion ...Starten, CDs nacheinander einlegen und Kaffee trinken gehen.
#include <Date.au3>
; Laufwerk
$drive = "E:"  
; Zielordner
$target = "D:\temp"  
; Dauerschleife
while 1
        ; Wenn Laufwerk READY dann fange an zu kopieren
	if DriveStatus($drive & "\") = "READY" then  
                ; aktuelles Datum holen
		$tm = _Date_Time_GetSystemTime()
                ; Zielordner zusammensetzen
		$destinationFolder = $target & "\disk_" & StringRegExpReplace(_Date_Time_SystemTimeToDateTimeStr($tm,1),"[/:\s]","")  
                ; Inhalt der CD kopieren
		DirCopy($drive,$destinationFolder)
                ; Disk auswerfen
		CDTray($drive,"open")  
	EndIf
        ; schlafen legen bis nächste Disk eingelegt wurde
	while DriveStatus($drive & "\") <> "READY"  
		Sleep(1)
	WEnd
Wend

Das sollte es für's Thema nun gewesen sein.
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
Mitglied: Yellowcake
Yellowcake 04.05.2018 um 13:22:01 Uhr
Goto Top
Zitat von @colinardo:

Hier noch für die Auto-It Fraktion ...Starten, CDs nacheinander einlegen und Kaffee trinken gehen.
> #include <Date.au3>
> ; Laufwerk
> $drive = "E:"  
> ; Zielordner
> $target = "D:\temp"  
> ; Dauerschleife
> while 1
>         ; Wenn Laufwerk READY dann fange an zu kopieren
> 	if DriveStatus($drive & "\") = "READY" then  
>                 ; aktuelles Datum holen
> 		$tm = _Date_Time_GetSystemTime()
>                 ; Zielordner zusammensetzen
> 		$destinationFolder = $target & "\disk_" & StringRegExpReplace(_Date_Time_SystemTimeToDateTimeStr($tm,1),"[/:\s]","")  
>                 ; Inhalt der CD kopieren
> 		DirCopy($drive,$destinationFolder)
>                 ; Disk auswerfen
> 		CDTray($drive,"open")  
> 	EndIf
>         ; schlafen legen bis nächste Disk eingelegt wurde
> 	while DriveStatus($drive & "\") <> "READY"  
> 		Sleep(1)
> 	WEnd
> Wend
> 

Das sollte es für's Thema nun gewesen sein.
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.


ui das ist gut, das verstehe ich eher als das Phowershell ding face-smile Danke Held des Wochenendes