Überprüfen, ob SD-Karte im Laufwerk ist
Hallo zusammen,
ich muss Euch mal wieder nerven, ich verzweifele daran, mit hilfe einer Batch, zu überprüfen, ob eine SD-Karte im Laufwerk ist.
Wenn eine Karte ins Laufwerk gesteckt ist/wird, soll die Größe angezeigt werden - das Funktioniert dank Hilfe von "Highload" (nochmals danke dafür).
Was ich gerne hätte: Wenn keine Karte drin ist, dann bitte warten - Karte rein - Größe anzeigen - warten bis zur nächsten Karte.
Wenn ich mit "if exist j:" arbeite, bekomme ich ein Windows-Fenster, "Kein Datenträger im Laufwerk...." und ich muss auf "Abrechen" klicken.
Dann bin ich ausgewichen auf vol %LW% >NUL 2>NUL und Errorlevels, (Batch angepaßt aus Thema "Batch Laufwerk abfragen", Batch von "miniversum
miniversum" , also so:
Allerdings läuft die Batch in einer Endlosschleife, erzählt mir entweder die gewünschte Kapazität der SD-Karte, oder sagt halt, dass ich keine Karte im Laufwerk habe.
ok. damit kann ich schon arbeiten.
Ich denke aber, dass geht um einiges "Schöner" als ich es gemacht habe. Und ich schätze mal, dass ihr meinen "Roman" auf einen 3-Zeiler kürzen könnt - Richtig?
Danke für Eure Mühen und Hilfen
Frank
ich muss Euch mal wieder nerven, ich verzweifele daran, mit hilfe einer Batch, zu überprüfen, ob eine SD-Karte im Laufwerk ist.
Wenn eine Karte ins Laufwerk gesteckt ist/wird, soll die Größe angezeigt werden - das Funktioniert dank Hilfe von "Highload" (nochmals danke dafür).
Was ich gerne hätte: Wenn keine Karte drin ist, dann bitte warten - Karte rein - Größe anzeigen - warten bis zur nächsten Karte.
Wenn ich mit "if exist j:" arbeite, bekomme ich ein Windows-Fenster, "Kein Datenträger im Laufwerk...." und ich muss auf "Abrechen" klicken.
Dann bin ich ausgewichen auf vol %LW% >NUL 2>NUL und Errorlevels, (Batch angepaßt aus Thema "Batch Laufwerk abfragen", Batch von "miniversum
miniversum" , also so:
@echo off
set LW=J:
rem Initialstate hermitteln
vol %LW% >NUL 2>NUL
set LWState=%errorlevel%
rem prüfung in Schleife (im 3s Intervall)
:loop
ping -n 3 localhost >NUL 2>NUL
vol %LW% >NUL 2>NUL
call :StCh%errorlevel%%LWState%
pause
goto:loop
:StCh00 & rem SD-Karte eingelegt mit Status 00
powershell -Executionpolicy Bypass -Command "gwmi win32_logicaldisk -Filter 'DriveType=2' | select DeviceID,VolumeName,Description,@{n='Size';e={'{0:N2} GB' -f ($_.Size / 1GB)}}"
goto:loop
:StCh01 & rem SD-Karte eingelegt mit Status 01
powershell -Executionpolicy Bypass -Command "gwmi win32_logicaldisk -Filter 'DriveType=2' | select DeviceID,VolumeName,Description,@{n='Size';e={'{0:N2} GB' -f ($_.Size / 1GB)}}"
goto:loop
:StCh10 & rem Keine SD-Karte eingelegt Status 10
goto:loop
:StCh11 & rem Keine SD-Karte eingelegt Status 11
goto:loop
Allerdings läuft die Batch in einer Endlosschleife, erzählt mir entweder die gewünschte Kapazität der SD-Karte, oder sagt halt, dass ich keine Karte im Laufwerk habe.
ok. damit kann ich schon arbeiten.
Ich denke aber, dass geht um einiges "Schöner" als ich es gemacht habe. Und ich schätze mal, dass ihr meinen "Roman" auf einen 3-Zeiler kürzen könnt - Richtig?
Danke für Eure Mühen und Hilfen
Frank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 309121
Url: https://administrator.de/forum/ueberpruefen-ob-sd-karte-im-laufwerk-ist-309121.html
Ausgedruckt am: 09.01.2025 um 00:01 Uhr
25 Kommentare
Neuester Kommentar
Hi.
Example in Powershell to subscribe insertion event of removable media:
The code subscribes the event sink for new inserted removable media and writes the info on the screen as soon as a media is inserted into a drive.
Regards
Example in Powershell to subscribe insertion event of removable media:
Get-EventSubscriber | Unregister-Event -Force
Register-WmiEvent -Query "Select * From __InstanceCreationEvent Within 1 where TargetInstance isa 'Win32_LogicalDisk' and TargetInstance.DriveType = 2" -SourceIdentifier 'RemovableDetector' -Action {
$data = $Event.SourceEventArgs.NewEvent.TargetInstance | select DeviceID,VolumeName,Description,@{n='Size';e={'{0:N2} GB' -f ($_.Size / 1GB)}} | ft -AutoSize | out-string
write-host "New media detected" -F Green
write-host $data
} | out-null
cls
write-host 'Waiting for new removable media ...' -F Green
while($true){sleep 1}
Regards
Sorry, there was an apostrophe to much at the end of the WQL query . It's corrected in the above code.
It works, tested on Windows 7 x64 with two different card readers.
You can also test the wql query before with the tool wbemtest.
There should come messages when inserting the removable media.
If nothing comes when inserting the card, try replacing __InstanceCreationEvent with __InstanceOperationEvent to see if events are coming at all on your device.
You can also test the wql query before with the tool wbemtest.
There should come messages when inserting the removable media.
If nothing comes when inserting the card, try replacing __InstanceCreationEvent with __InstanceOperationEvent to see if events are coming at all on your device.
Then it could be that your device is issuing the __InstanceModificationEvent in case of connecting. You can also react to this event if you wish...
Servus Frank.
guckst du:
Grüße Uwe
guckst du:
Get-EventSubscriber | Unregister-Event -Force
Register-WmiEvent -Query "SELECT * FROM Win32_VolumeChangeEvent WHERE EventType=2" -SourceIdentifier 'RemovableDetector' -Action {
write-host "New media detected." -F Green
# Driveletter
$driveletter = $Event.SourceEventArgs.NewEvent.DriveName
# Get volume
$drive = gwmi win32_Volume | ?{$_.DriveLetter -eq $driveletter}
write-host "Formatting Volume $driveletter with $format ... " -F Yellow -NoNewline
# quick format volume with default blocksize and no label
$result = $drive.Format($drive.FileSystem,$true,'','',$false)
# check format result
if ($result.ReturnValue -eq 0){
write-host "OK." -F Green
}else{
write-host "Error formatting: $($result.ReturnValue)." -F Red
}
# output data
write-host ($Event.SourceEventArgs.NewEvent | select DriveName,@{n='Size';e={'{0:N2} GB' -f ($drive.Capacity / 1GB)}} | ft -AutoSize | out-string)
# eject drive
write-host "Ejecting drive $driveletter... " -F Green -NoNewline
(New-Object -Com Shell.Application).Namespace(17).ParseName($driveletter).Verbs() | ?{$_.Name.replace('&','') -match '^(Auswerfen|Eject)$'} | %{$_.Doit()}
write-host "Done." -F Green
write-host 'Waiting for new removable media ...' -F Green
} | out-null
cls
write-host 'Waiting for new removable media ...' -F Green
while($true){sleep 1}
Von Powershell habe ich (immer noch) keine Ahnung.
Dann wird's Zeit .Grüße Uwe
Zitat von @kaeptenblei:
vielen Dank für die Antwort und die Hilfe, leider funktioniert es bei mir nicht.
Hier unter Windows 7 getestet mit Card-Reader und MicroSD-Wechsel.vielen Dank für die Antwort und die Hilfe, leider funktioniert es bei mir nicht.
Das Problem hatte ich ja am Anfang auch schon - da sollte ich "__InstanceCreationEvent" mit "__InstanceOperationEvent" austauschen, diesen Befehl gibt es aber im neuen Script nicht mehr.
Weil das erste Event hier nicht zuverlässig einmalige Events liefert sondern doppelt Events feuert wenn das Laufwerk gezogen wird.Hier ist Win32_VolumeChangeEvent zuverlässiger da EventType das Einlegen eines neuen Mediums signalisiert.
Muss bei Speicherkarten auch das Laufwerk ausgeworfen werden?
Rechtsklick -> Eject reicht, nicht den Card-Reader auswerfen!! Laufwerke sollten dazu im Explorer standardmäßig ausgeblendet sein.Für die anderen Events kann ich es dir bei Bedarf umschreiben. Das ist je nach Card-Reader anders.
Ich sehe jetzt was bei dir das Problem ist.
Bei dir sind alle Laufwerke immer im Explorer sichtbar so wie es aussieht, werden erscheinen also nicht erst wenn ein Medium eingelegt ist. In dem Fall ist es klar das mein letzte Skript bei dir nicht funktioniert. Ich nutze hier USBSafelyRemove das mir alle nicht belegten Slots des Readers im System ausblendet, deswegen Feuert das Event hier und bei dir nicht.
Das __InstanceOperationEvent reagiert nicht nur auf das Einlegen eines Speichermediums sondern auch beim Entfernen so das man hier zusätzlich filtern muss deswegen nutze ich hier __InstanceModificationEvent, zusätzlich gilt es zu beachten (was ich gerade noch festgestellt habe) wenn die Karte formatiert wird wird sie kurzfristig vom System ausgeworfen und wieder eingelegt, würde also ein erneutes Formatieren triggern. All das habe ich hier in dem folgenden Skript berücksichtigt.
Es sollte nun auf deinem System auch funktionieren.
-SCRIPT REMOVED-
Grüße Uwe
Bei dir sind alle Laufwerke immer im Explorer sichtbar so wie es aussieht, werden erscheinen also nicht erst wenn ein Medium eingelegt ist. In dem Fall ist es klar das mein letzte Skript bei dir nicht funktioniert. Ich nutze hier USBSafelyRemove das mir alle nicht belegten Slots des Readers im System ausblendet, deswegen Feuert das Event hier und bei dir nicht.
Das __InstanceOperationEvent reagiert nicht nur auf das Einlegen eines Speichermediums sondern auch beim Entfernen so das man hier zusätzlich filtern muss deswegen nutze ich hier __InstanceModificationEvent, zusätzlich gilt es zu beachten (was ich gerade noch festgestellt habe) wenn die Karte formatiert wird wird sie kurzfristig vom System ausgeworfen und wieder eingelegt, würde also ein erneutes Formatieren triggern. All das habe ich hier in dem folgenden Skript berücksichtigt.
Es sollte nun auf deinem System auch funktionieren.
-SCRIPT REMOVED-
Grüße Uwe
Nee, vergess das Skript, ich hatte deine erste Schilderung am Anfang missinterpretiert, heut ist aber auch der Wurm drin .... nicht mein Tag heute, sorry zu viel um die Ohren.
Ich schreibe es dir so bald es zeitlich geht um.
bei manchen SD-Karten ist die Partition verbogen
Das geht so in der obigen Art nicht wenn die Disks inkonsistent sind.Ich schreibe es dir so bald es zeitlich geht um.
So, da du die komplette Disk cleanen willst folgendes Skript:
(hier mit Diskpart da unter WIN7 die Storage-CMDLets wie Clear-Disk etc. fehlen.)
Wurde auf Windows 7 x64 und einem Baumarkt-Cardreader mit sichtbaren LW-Buchstaben und einer SD-Card mehrfach erfolgreich getestet.
Grüße Uwe
(hier mit Diskpart da unter WIN7 die Storage-CMDLets wie Clear-Disk etc. fehlen.)
Wurde auf Windows 7 x64 und einem Baumarkt-Cardreader mit sichtbaren LW-Buchstaben und einer SD-Card mehrfach erfolgreich getestet.
Get-EventSubscriber | Unregister-Event -Force
$global:lasttime = $null
$global:lastdrive = $null
function ConvertFrom-CP850([string[]]$string){
$cp850 = [System.Text.Encoding]::GetEncoding(850)
$string | %{$cp850.GetString([System.Console]::OutputEncoding.GetBytes($_))}
}
Register-WmiEvent -Query "Select * From __InstanceModificationEvent Within 1 where TargetInstance isa 'Win32_DiskDrive' and TargetInstance.MediaType = 'Removable Media' and TargetInstance.Size != null" -SourceIdentifier 'RemovableDetector' -Action {
$deviceid = $Event.SourceEventArgs.NewEvent.TargetInstance.DeviceID
$index = $Event.SourceEventArgs.NewEvent.TargetInstance.Index
# check if same drive inserted again after formatting (loop protection)
if ($global:lastdrive -eq $deviceid -and $global:lasttime -ge (get-date).AddSeconds(-10)){return}
$global:lasttime = get-date
$global:lastdrive = $deviceid
# list drive information
write-host "New disk loaded." -F Green
write-host ($Event.SourceEventArgs.NewEvent.TargetInstance | select Caption,Description,DeviceId,Index,@{n='DiskSize';e={'{0:N2} GB' -f ($_.Size / 1GB)}} | ft -AutoSize | out-string)
write-host "Cleaning disk ..." -F Green
# clean disk
$result = ConvertFrom-CP850 ("select disk $index`nclean`ncreate partition primary`nactive`nformat quick`nexit" | diskpart | out-string)
write-host $result -F Yellow
write-host "Done." -F Green
write-host 'Waiting for new removable media ...' -F Green
} | out-null
cls
write-host 'Waiting for new removable media ...' -F Green
while($true){sleep 1}
Läuft hier einwandfrei, wird die SD Karte sein oder ein Programm auf deinem Rechner wie Virenscanner & Co belegen die Laufwerke währenddessen mit Zugriffen.
P.s. wenn du schon die neue Kiste hast kannst du auch gleich das neue CMDlet zum cleanen von Disks benutzen
Clear-Disk
anstatt Diskpart fernzusteuern.
P.s. wenn du schon die neue Kiste hast kannst du auch gleich das neue CMDlet zum cleanen von Disks benutzen
Clear-Disk
anstatt Diskpart fernzusteuern.