11 Replies Latest reply on May 7, 2018 2:43 AM by derniwi

    NVMe per WMI erkennen?

    SitzRieSe Expert

      Hi Leute,

       

      hat hier schon Jemand versucht ein NVMe Drive per WMI zu erkennen? Hintergrund wir haben hier ein Notebook Modell bekommen wo ein NVMe Drive und eine SATA HD eingebaut ist. Die SATA HD ist Physicaldrive 0, welches dann entsprechend von DSM formatiert wird.

       

      Jetzt möchte ich in das DSM Partitionierungsskript eine Erkennung einbauen. Wenn Disk1 = NVme set disknumber=1.

       

      Ich hab dann mal ein wenig mit dem WMI Explorer experimentiert. Leider wird dort der InterfaceType in der Win32_DiskDrive Klasse als SCSI ausgegeben:

       

       

      Man könnte jetzt noch mit PNPDeviceID rum experiemntieren und vielleicht so die Info filtern. Übersteigt dann aber etwas meine Bat Kenntnisse da das ja alles in .BAT sein muss.

       

      Habt ihr sowas schon mal versucht?

       

      Ich hab hier noch das gefunden:

       

      How to: query disk information by WMI from Hard Disk Sentinel

       

      Das funzt aber nur mit installierten Hard Disk Sentinel :-/

       

      Bin für jede Hilfe dankbar!

        • 1. Re: NVMe per WMI erkennen?
          derniwi Master

          Hallo Alexander,

           

          mangels NVMe-"Platte" kann ich nur etwas raten.

          Wenn Du per WMIC eine Abfrage hast, müsste eigentlich ein "Where PNPDeviceID LIKE '*NVME*'" helfen.

           

          Gruß

          Nils

          • 2. Re: NVMe per WMI erkennen?
            malex_17 Apprentice

            cmd: wmic diskdrive get caption | findstr /I "nvme"

            powershell: (get-wmiobject win32_diskdrive).Caption -match "nvme")

             

            Funktioniert bei all unseren geräten einwandfrei.

             

            EDIT: sehe gerade, dass die Caption den Identifier nicht enthält. Das machts dann schon etwas schwieriger. Statt "caption" "pnpdeviceid" verwenden?

            • 3. Re: NVMe per WMI erkennen?
              derniwi Master

              WMIC.EXE DiskDrive Where "PnpDeviceId LIKE '%VEN_NVME%'" Get PnpDeviceId | FIND.EXE /I "VEN_NVME"

              IF %ERRORLEVEL% EQU 1 ECHO No NVME drive found

              • 4. Re: NVMe per WMI erkennen?
                SitzRieSe Expert

                Hi Zusammen,

                 

                danke für die vielen Antworten. Wir haben uns nun dazu entschlossen es über diskpart zu lösen, da wir nicht wissen ob PnpDeviceId bei allen Modellen immer gleich ist. Bei der Lösung von Malex zum Beispiel schlägt die Abfrage fehl weil bei unserem Modell unter caption kein nvme vorkommt:

                 

                 

                 

                 

                 

                Diskpart scheint den Typ richtig ausgeben zu können:

                 

                 

                Im Partitionsskript:

                 

                for /f "tokens=*" %%i in ('diskpart /s c:\osd\listdisks.txt^| find "Online" /c') do Set disks=%%i

                if /i %disks% GTR 1 (GOTO Disk0) else (GOTO Select0)

                 

                :Disk0

                for /f "tokens=*" %%i in ('diskpart /s c:\osd\disk0.txt^| findstr /i /B "Typ"') do Set disk=%%i

                if %disk:~9,-1% == NVMe (GOTO Select0) else (GOTO Disk1)

                 

                :Disk1

                for /f "tokens=*" %%i in ('diskpart /s c:\osd\disk1.txt^| findstr /i /B "Typ"') do Set disk=%%i

                if %disk:~9,-1% == NVMe GOTO Select1

                 

                :Select0

                set disknumber=0

                GOTO End

                 

                :Select1

                set disknumber=1

                GOTO End

                 

                :End

                 

                Das geht sicherlich noch etwas schöner, aber das funktioniert schon ganz gut

                • 5. Re: NVMe per WMI erkennen?
                  malex_17 Apprentice

                  Hätt noch einen:

                   

                  • 6. Re: NVMe per WMI erkennen?
                    derniwi Master

                    Hallo Alexander,

                     

                    hier musst Du evtl. aufpassen, wenn Du englische und deutsche Versionen verteilst. Theoretisch sollte das aber nur an der Sprachversion des WinPE liegen. Allerdings könnte sich die Ausgabe von WinPE 3 zu 4 auch ändern.

                     

                    Anstelle von

                    :Disk0

                    for /f "tokens=*" %%i in ('diskpart /s c:\osd\disk0.txt^| findstr /i /B "Typ"') do Set disk=%%i

                    if %disk:~9,-1% == NVMe (GOTO Select0) else (GOTO Disk1)

                     

                    sollte dies hier etwas eleganter sein:

                     

                    :Disk0

                     

                    for /f "tokens=2 delims=: " %%i in ('type c:\temp\test.txt ^| findstr /i /B "Typ"') do Set disk=%%~i

                    if /i "%disk%" == "NVMe" (GOTO Select0) else (GOTO Disk1)

                     

                     

                    Durch "delims=: " (wichtig ist auch das Leerzeichen hinter dem Doppelpunkt) wird der Doppelpunkt als Trennzeichen verwendet. Somit wird eigentlich nur noch eine Zeile gesucht, in der "Typ" enthalten ist, aber letztlich ist es egal, ob hier "Typ" oder "Type" steht. Es wird dann - wegen "tokens=2" erst der zweite Wert aus der Liste (durch Doppelpunkte und Leerzeichen getrennt) verwendet. Und mit der Tilde in "Set disk=%%~i" entfernt man noch die Anführungszeichen.

                    Somit hat man bei If nicht mehr die Notwendigkeit, mit festen Positionen zu arbeiten. Die Anführungszeichen um %disk% und "NVMe" würde ich lassen, falls die Variable "disk" leer ist.

                    Und das "/i" bei If sorgt dafür, dass Groß-/Kleinschreibung bei der Überprüfung ignoriert wird.

                     

                    Gruß

                    Nils

                    • 7. Re: NVMe per WMI erkennen?
                      SitzRieSe Expert

                      Alterschwede war das ein Akt das ans Laufen zu kriegen

                       

                      Problem war danach die Windows Installation, die mit dem InstallonactivePartition in der unattend ausschließlich auf Disk 0 installiert. Selbst wenn nur Disk 1 verfügbar ist geht die Windows Install auf die Nase. Wir haben dann mit devcon hantiert und konnten die Disks neu sortieren, sind dann aber in das nächste Problem gelaufen. Ist die 2. Festplatte bereits formatiert und hat keine Partition mehr, deaktiviert devcon die nvme Disk nicht (Warum auch immer) und das Laufwerk bleibt Disk 1. Bis wir das alles ausprobiert und rausgefunden haben vergingen jetzt 2 Tage.

                       

                      Nun haben wir eine funktionierende Version. Hierbei werden zuvor mit diskpart disk 1 und 2 offline genommen. Im Anschluss mit devcon alle verfügbaren disks deaktiviert und anschließend die nvme aktiviert. Danach ist nvme Disk 0 und Windows kann sauber installieren.

                       

                      for /f "tokens=*" %%%%i in ('diskpart /s X:\Enteo\listdisks.txt^| find "Online" /c') do Set disks=%%%%i

                       

                      if /i %%disks%% GTR 1 (GOTO NVMe0) else (GOTO Select0)

                       

                       

                       

                      :NVMe0

                       

                      for /f "tokens=2 delims=: " %%%%i in ('diskpart /s X:\Enteo\disk0.txt^| find /i "Type   :"') do Set disk=%%%%~i

                       

                      if /i %%disk%% == NVMe (GOTO Select0) else (GOTO NVMe1)

                       

                      :NVMe1

                       

                      for /f "tokens=2 delims=: " %%%%i in ('diskpart /s X:\Enteo\disk1.txt^| find /i "Type   :"') do Set disk=%%%%~i

                       

                      if /i %%disk%% == NVMe (GOTO disabledisk) else (GOTO Select0)

                       

                       

                       

                      :disabledisk

                       

                      diskpart /s X:\Enteo\offlinedisks.txt

                       

                       

                       

                      "X:\Enteo\devcon.exe" disable *disk*

                       

                       

                       

                      ping 127.0.0.1 -n 10 -w 1000 1>nul

                       

                       

                       

                      "X:\Enteo\devcon.exe" enable *NVMe*

                       

                       

                       

                      ping 127.0.0.1 -n 10 -w 1000 1>nul

                       

                       

                       

                      :Disk0

                       

                      set disk=0

                       

                       

                       

                      diskpart /s X:\Enteo\onlinedisk0.txt

                       

                       

                       

                      for /f "tokens=2 delims=: " %%%%i in ('diskpart /s X:\Enteo\disk0.txt^| find /i "Type   :"') do Set disk=%%%%~i

                       

                      if /i %%disk%% == NVMe (GOTO Select0) else (GOTO error)

                       

                       

                       

                      :Select0

                       

                      set disknumber=0

                       

                       

                       

                      Sowie es jetzt ist, ist es eigtl ziemlich geil. Das Partitionsskript kann universell für alle Systeme eingesetzt werden. Findet das System eine NVMe Platte sorgt er dafür das Sie auf Laufwerk 0 gemounted wird, falls erforderlich und formatiert dann das richtige Laufwerk und Windows installiert. Desweiteren muss man nicht an der unattend rumfummeln! Das war mir nämlich ein Dorn im Auge

                      • 8. Re: NVMe per WMI erkennen?
                        derniwi Master

                        Hallo Alexander,

                         

                        jetzt die Kür: bei der Windows-Installation mal einen USB-Stick, eine USB-Festplatte und eine SD-Karte im Rechner haben (bzw. alle Kombinationen)...

                         

                        Gruß

                        Nils

                        • 9. Re: NVMe per WMI erkennen?
                          DaHa Apprentice

                          Alles rund um USB (aktuelle Realtek Cardreader sind in Lenovo Notebooks auch per USB intern verdrahtet) ganz einfach per

                           

                          devcon.exe disable USBSTOR\*

                          • 10. Re: NVMe per WMI erkennen?
                            SitzRieSe Expert

                            Er müsste mit dem disable *disk* auch schon usb drives mit deaktivieren. Ich glaube aber das das aber auch kein Problem sein sollte, weil USB Laufwerke jawohl nicht als 0 oder 1 erkannt werden und bereits verbundene Laufwerke werden nicht umsortiert. Das bedeutet ist USB als Disk 2 erkannt und du deaktivierst mit devcon alle anderen Disks, bleibt das USB Drive auf Laufwerk 2. Selbst wenn er das USB Laufwerk auch disablen sollte, aktiviert er ja im Anschluss nur das NVMe Laufwerk. Ich werde es mal ausprobieren, aber ich glaube das wird auch mit angeschlossenen USB Laufwerk richtig funktionieren.

                            • 11. Re: NVMe per WMI erkennen?
                              derniwi Master

                              Ich habe folgende Befehle im Skript:

                              devcon.exe disable USBSTOR\*

                              devcon.exe disable *CDROM*

                               

                              Bei modernen Rechnern könnte ein SD-Kartenleser auch per PCIe angeschlossen sein, oder?