kaeptenblei
Goto Top

Ü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:

@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 face-smile - Richtig?

Danke für Eure Mühen und Hilfen
Frank

Content-Key: 309121

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

Printed on: April 20, 2024 at 02:04 o'clock

Mitglied: 129813
129813 Jul 07, 2016 updated at 10:11:10 (UTC)
Goto Top
Hi.
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}
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.

screenshot

Regards
Member: kaeptenblei
kaeptenblei Jul 07, 2016 at 11:03:19 (UTC)
Goto Top
Hi Highload,

danke nochmals für dein Skript.
Leider bekomme ich es nicht richtig ans Laufen.

Es erscheint nur "Waiting for new removable media" - es wird aber nicht erkannt, wenn ich eine SD-Karte einlege.

Starte ich das Script in der PowerShell ISE kommt folgende Meldung:
Register-WmiEvent : Nicht analysierbare Abfrage. 
Bei F:\SD.ps1:2 Zeichen:18
+ Register-WmiEvent <<<<  -Query "Select * From __InstanceCreationEvent Within 1 where TargetInstance isa 'Win3  
2_LogicalDisk' and TargetInstance.DriveType = 2'" -SourceIdentifier 'RemovableDetector' -Action {  
    + CategoryInfo          : NotSpecified: (:) [Register-WmiEvent], ManagementException
    + FullyQualifiedErrorId : System.Management.ManagementException,Microsoft.PowerShell.Commands.RegisterWmiE 
   ventCommand
 
Waiting for new removable media ...

Mit Powershell kenne ich mich nicht aus, es ist das erste mal, dass ich Powershell nutze.

Das habe ich gemacht.
Powershell als Admin aufgerufen und das Ausführen von Scripten zugelassen (Set-ExecutionPolicy Unrestricted)
Dein Script als SD.ps1 gespeichert und ausgeführt.

Hast Du noch eine Idee?

Vielen Dank
Frank
Member: kaeptenblei
kaeptenblei Jul 07, 2016 at 11:13:28 (UTC)
Goto Top
Ist das wichtig?
Ich arbeite mit Win7 prof . x64 ?
Mitglied: 129813
129813 Jul 07, 2016 updated at 11:26:18 (UTC)
Goto Top
Sorry, there was an apostrophe to much at the end of the WQL query face-smile. It's corrected in the above code.
Member: kaeptenblei
kaeptenblei Jul 07, 2016 at 11:35:41 (UTC)
Goto Top
Nothing to be sorry, I'm very happy that you are help me.

I tried your Script again, now it start without an error message, but it shows only the message "Waiting for new removable media". But if I insert a SD-Card, nothing happens.
Sorry, that I make you so much work.
Mitglied: 129813
Solution 129813 Jul 07, 2016 updated at 11:53:53 (UTC)
Goto Top
It works, tested on Windows 7 x64 with two different card readers.

You can also test the wql query before with the tool wbemtest.

161ae132c5e23000e45ce922f105781b

screenshot

There should come messages when inserting the removable media.

screenshot

If nothing comes when inserting the card, try replacing __InstanceCreationEvent with __InstanceOperationEvent to see if events are coming at all on your device.
Member: kaeptenblei
kaeptenblei Jul 07, 2016 at 13:07:16 (UTC)
Goto Top
Thank so much Highload,

Zitat von @129813:
If nothing comes when inserting the card, try replacing __InstanceCreationEvent with __InstanceOperationEvent to see if events are coming at all on your device.

That's it!!!!
if I use the old one "__InstanceCreationEvent" I must unplug and re-connect the CardReader. Than it shows alle the drives of the cardreader.

But with "__InstanceOperationEvent" I can only plugin the SD-Card.... ok it shows also the "0,00 GB" when I unplug the card, but that is good, so I can see, that the script is working and don't show the old card (same with wbemtest).

You make me happy. Thank you and have a nice day

Frank
Mitglied: 129813
129813 Jul 07, 2016 at 15:24:31 (UTC)
Goto Top
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...
Member: kaeptenblei
kaeptenblei Jul 09, 2016 at 15:00:05 (UTC)
Goto Top
Yes, this works also fine. Both working.
Put the card into the reader - 1,85 GB
Pull it out - 0,00 GB.

Thank you
Member: kaeptenblei
kaeptenblei Jan 04, 2018 at 10:52:42 (UTC)
Goto Top
Hallo zusammen,
seit über einem Jahr nutze ich nun schon das Skript - läuft super und hilft mir sehr.

Jetzt habe ich noch einen Haufen SD-Karten auf den Tisch gestellt bekommen, wo DATEN drauf sind ;-(

Läst sich vor der Größenanzeige ein FORMAT-Befehl setzen, der die Karten im Standart-Filesystem formatiert (bis 2GB SD-Karten = FAT; ab 4GB-SD-Karten = FAT32) und anschließen soll dann die Größe angezeigt werden (wie bisher)?
Am liebsten OHNE Sicherheitsabfrage - no risk, no fun face-wink - Also Karte einstecken - formatieren - Größe anzeigen - nächste Karte

Von Powershell habe ich (immer noch) keine Ahnung.

Danke Euch
Frank
Member: colinardo
colinardo Jan 04, 2018, updated at Jan 05, 2018 at 00:41:16 (UTC)
Goto Top
Servus Frank.
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 face-wink.

Grüße Uwe
Member: kaeptenblei
kaeptenblei Jan 04, 2018 updated at 16:25:45 (UTC)
Goto Top
Hallo Uwe,

vielen Dank für die Antwort und die Hilfe, leider funktioniert es bei mir nicht.

Es wird kein SD-Karten Wechsel erkannt, nur ein Laufwerkswechsel (Kabel vom Reader abziehen und neu anschließen), bzw. ein USB-Stick wird auch erkannt.
Aber in beiden Fällen bekomme ich einen Fehler beim Formatieren: "Error formatting: 3" (Screenshot Laufwerk N: = USB-Stick; J: = Reader mit eingelegter SD-Karte. (denke mal Fehler 11 ist kein(e) Speicher(karte) im Laufwerk? = die andern Laufwerksbuchstaben)

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.

Zitat von 129813:
If nothing comes when inserting the card, try replacing __InstanceCreationEvent with __InstanceOperationEvent to see if events are coming at all on your device.>

Hast Du da noch eine Idee für mich.

Muss bei Speicherkarten auch das Laufwerk ausgeworfen werden? Cancelt der Befehl vielleicht das Laufwerk???

Vielen Dank und Gruß
Frank
sd-format
Member: colinardo
colinardo Jan 04, 2018 updated at 17:02:01 (UTC)
Goto Top
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.
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.
Member: kaeptenblei
kaeptenblei Jan 04, 2018 at 17:13:49 (UTC)
Goto Top
Dann bin ich wohl doch langsam zu alt für Computers.... ach was war C64 Basic doch schön face-wink

Hab auch Win7 x64 - auch am 2.ten PC mit W7x64 geht es nicht, habe 4 verschiedene USB-Cardreader (alles diese Multifunktionsteile für unterschiedliche Karten) durch.

Am 2.ten PC (noch Powershell jungfreulich) habe ich das ausführen von Powershell-Scrips erlaub mit folgenden Befehl:
--> Windows PowerShell als Admin gestartet
--> Set-ExecutionPolicy Unrestricted

Würdest Du das Script für mich vielleicht ändern mit dem Event "__InstanceOperationEvent" (damit läuft zumindest die Größenanzeige der SD-Karten).
Oder hast Du eine andere Idee?

Danke Dir
Frank
Member: colinardo
colinardo Jan 04, 2018, updated at Jan 05, 2018 at 00:38:50 (UTC)
Goto Top
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
Member: kaeptenblei
kaeptenblei Jan 04, 2018 at 18:29:45 (UTC)
Goto Top
Hi Uwe,
ich trau mich es ja garnicht zu sagen.... der SD-Karten Wechsel wird jetzt erkannt, aber das Formatieren klappt nicht face-sad

Meldung:
"Formatting Volume J: with FAT ... Error formatting: . "
(zeigt keine Fehlernummer - nur den Punkt)

Zu den LW-Buchstaben: auf dem Hauptrechner habe ich im Explorer unter --> Extras --> Optionen --> Ansicht --> "Leere Laufwerke im Ordner "Computer" ausblenden" aktiviert, also die LWs werden nicht angezeigt (reicht aber wohl dann nicht) auf dem anderen PC läuft einen Win7 "Grundinstallation" , da werden die LW-Buchstaben angezeigt.

Sorry für die ganze Arbeit.
Danke
Frank
Member: kaeptenblei
kaeptenblei Jan 04, 2018 updated at 18:47:04 (UTC)
Goto Top
OH wei - ich habe gerade noch was festgestellt....
bei manchen SD-Karten ist die Partition verbogen... da haben die Karten zwischen 1,75 - 1,85 GB....
Wenn ich die mit dem SDFormatter und "Format Size Adjustment = ON" bearbeite, haben die nachher alle 1,85GB.

Kannst Du noch einen DISKPART ( - damit geht es auch - gemacht habe ich clean, create partition primary, active, format) - oder was es immer bei Powershell gibt - einbauen... Der Karten Bier geht auf mich face-smile

Sorry und Gruß
Frank
Member: colinardo
colinardo Jan 04, 2018 updated at 21:44:25 (UTC)
Goto Top
Dat ist dein Problem, deine Kiste läuft mit einer veralteten Powershell. Soll ich dat jetzt auch noch für die zweier umschreiben, nö ...
Den Wunsch gibts von mir nicht mehr für ümmesöns, schon gar nicht für Windows 7 face-wink.
Member: kaeptenblei
kaeptenblei Jan 04, 2018 at 23:17:28 (UTC)
Goto Top
Powershell zweier - hattest recht - jetzt 5.1 aber gleiches Problem.... (siehe Screenshot)
Kasten Bier hatte ich ja schon angeboten face-smile - "ümmesöns????" Trinkst Du vielleicht Kölsch (hab ich da)??

Ich kram morgen mal mein Notebook mit W10 raus.... da läuft's bestimmt - oder???

Danke Dir
Frank
ps-version
Member: colinardo
colinardo Jan 05, 2018 updated at 00:54:50 (UTC)
Goto Top
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.
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.
Member: colinardo
Solution colinardo Jan 05, 2018 at 08:31:55 (UTC)
Goto Top
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.
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}
Grüße Uwe
Member: kaeptenblei
kaeptenblei Jan 05, 2018 at 11:49:37 (UTC)
Goto Top
UWE - SUPER - DANKE - LÄUFT !!!

Das Script läuft super... wenn man Powershell denn als ADMIN ausführt - kleiner Hinweis sei erlaubt, falls noch jemand so was braucht face-smile

Jetzt kann ich SD-Karten platt machen.

Danke und Gruß
Frank
Member: kaeptenblei
kaeptenblei May 21, 2018 at 18:02:31 (UTC)
Goto Top
Hi Uwe (und andere),

darf ich Dich/Euch nochmals "von der Seite" anquatschen.

Du hattest das super Powershell-Script erstellt, mit dem ich SD-Karten platt machen kann (Partition aufheben, neu erstellen, formatieren - ich muss nur noch die SD-Karten wechseln).

Jetzt habe ich einen neuen Rechner mit Win10 x64 (noch Build 1709) und das Script wirft einen Fehlermeldung aus.
Zusätzlich geht ein Fenster auf I:\ Der Verzeichnisname ist ungültig....

fehler

Die Meldung aus dem Ereignisprotokoll sieht so aus:
ereignisprotokoll-system

Das Script läuft aber weiter, und schein auch zu funktionieren.

Ich habe fast das Gefühl, dass der neue Rechner zu schnell ist ?!?
Oder muss man noch irgendwelche Einstellungen in Powerscript machen?

Hast Du/Ihr eine Idee.

Danke für die weitere Hilfe
Frank
Member: colinardo
colinardo May 21, 2018 updated at 19:01:30 (UTC)
Goto Top
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.
Member: kaeptenblei
kaeptenblei May 21, 2018 at 20:32:37 (UTC)
Goto Top
Danke Dir für die Antwort.

Das öffnende Fenster war in der Tat die "Autostart-Funktion".
Die Fehlermeldung bei Diskpart bleibt aber, auch mit ausgeschalteten Virenscanner u.ä.

Clear-Disk, wäre bestimmt toll - aber ich bin zu alt dafür face-smile
Ich bekomme doch noch nicht mal Powershell hin face-sad Nachher habe ich alle Datenträger gecleart face-smile (das schaffe ich bestimmt)
Da stelle ich mir doch lieber noch einen Win7 Rechner in die Ecke und hole den vor, wenn ich Karten formatieren muss.

Danke und Gruß
Frank