2 votes

Trouver un disque attaché spécifique, pas un volume, par Applescript

J'ai un script que j'utilise pour formater toute carte SD insérée, y copier les données de dossiers spécifiques, puis l'éjecter.

Chaque formatage/copie est déclenché manuellement, dans le cadre d'un processus de traitement par lots concernant une centaine de cartes. Je ne crains donc pas d'appuyer sur le bouton Start au mauvais moment ou sur la mauvaise carte.

Ce que j'essaie de trouver, c'est comment être absolument sûr que j'écris au bon endroit. disque

C'est ma ligne "importante".
do shell script "diskutil eraseDisk \"MS-DOS FAT16\" " & diskName & " MBRFormat disk6"

Le site disk6 n'est pas absolue, car je n'ai pas toujours le même nombre de disques montés. Je peux le vérifier manuellement avant de lancer le lot, à l'aide de la commande diskutil list puis changez ce paramètre dans le script.

Ce que j'aimerais pouvoir faire, c'est que le script vérifie lui-même quel lecteur il devrait être, puis l'insère comme variable, évitant ainsi tout "mauvais choix".

Les lecteurs exclus sont les disques non amovibles et les disques RAM [les volumes non montés tels que EFI et Recovery n'ont probablement pas besoin d'être filtrés] - ces derniers ont des noms de volumes connus - mais je n'arrive pas à trouver comment définir un nom de volume trouvé [connu ou inconnu, car les cartes SD peuvent s'appeler à peu près n'importe quoi avant de commencer] à un numéro de disque spécifique.


Précisions sur le lecteur de cartes, intégré à mon moniteur, Dell U2713H
Connexion via USB2 à partir d'un Mac Pro 4,1 [avec mise à jour matérielle 5,1].

USB Hi-Speed Bus:

  Host Controller Location: Built-in USB
  Host Controller Driver:   AppleUSBEHCI
  PCI Device ID:    0x3a3c 
  PCI Revision ID:  0x0000 
  PCI Vendor ID:    0x8086 
  Bus Number:   0xfa 

Hub:

  Product ID:   0x8043
  Vendor ID:    0x0451  (Texas Instruments)
  Version:  1.00
  Serial Number:    79000089BFB9
  Speed:    Up to 480 Mb/sec
  Location ID:  0xfa200000 / 2

//snips other devices//

USB3.0 Card Reader:

  Product ID:   0x0307
  Vendor ID:    0x0bda  (Realtek Semiconductor Corp.)
  Version:  1.63
  Serial Number:    201006010301
  Speed:    Up to 480 Mb/sec
  Manufacturer: Realtek
  Location ID:  0xfa233000 / 5

Exemple de sortie de df

Filesystem    512-blocks       Used  Available Capacity   iused     ifree %iused  Mounted on
/dev/disk1s2  1950314272  485618064 1464184208    25%  60766256 183023026   25%   /
devfs                412        412          0   100%       714         0  100%   /dev
/dev/disk0s2  3906357344 1195025808 2711331536    31% 149378224 338916442   31%   /Volumes/JuSpace
/dev/disk3s2  1951855464  635192376 1316663088    33%  79399045 164582886   33%   /Volumes/Downloads
/dev/disk2s2  5858067520 2309215360 3548852160    40% 144325958 221803260   39%   /Volumes/OhDaSpace
/dev/disk4s2  5753889792 4638480736 1115409056    81% 289905044  69713066   81%   /Volumes/TMach
map -hosts             0          0          0   100%         0         0  100%   /net
map auto_home          0          0          0   100%         0         0  100%   /home
/dev/disk3s4   408324240  210669592  197654648    52%    200589  98828207    0%   /Volumes/MacWin7
/dev/disk5       2097152     700536    1396616    34%     87565    174577   33%   /Volumes/RAM Disk
/dev/disk7s1     1936768     104192    1832576     6%       512         0  100%   /Volumes/F_CARD

Ou... Utilisation de ioreg -l avec le résultat suivant

| |   |   |             +-o Generic- SD/MMC/MS/MSPRO Media  <class IOMedia,$
| |   |   |               | {
| |   |   |               |   "Removable" = Yes
| |   |   |               |   "Content" = "FDisk_partition_scheme"
| |   |   |               |   "Whole" = Yes
| |   |   |               |   "Leaf" = No
| |   |   |               |   "BSD Name" = "disk7"

comment puis-je réparer quelque chose comme grep -A 100 SD/MMC/MS/MSPRO Media | grep disk | awk... pour trouver le disk7

2voto

klanomath Points 63400

Je ne suis pas très doué pour écrire des scripts d'Apple mais voici une idée pour résoudre votre problème.

Dans la première méthode décrite ci-dessous, j'effectue une recherche dans l'arbre des périphériques de system_profiler pour obtenir le DiskIdentifier d'un disque attaché au lecteur de carte USB3 intégré à votre moniteur Dell. Dans la deuxième méthode, j'utilise ioreg.

system_profiler :

Pour obtenir le DiskIdentifier d'une carte SD attachée au SD-Reader externe, utilisez quelque chose comme :

system_profiler -detailLevel mini | grep -A 30 0x0307 | awk '/disk/ {gsub("BSD Name:", ""); print $NF}'

avec grep -A 30 0x0307 : afficher les 30 lignes suivantes après avoir trouvé la chaîne de caractères 0x0307
y awk '/disk/ {gsub("BSD Name:", ""); print $NF}' pour obtenir le numéro de disque, mais supprimez Nom BSD : de la sortie.

La commande prend environ 10 secondes sur mon système.

Vous devrez peut-être ajuster la valeur de -A et la chaîne de caractéristiques (dans l'exemple ci-dessus, j'ai utilisé l'ID produit de votre lecteur de carte USB3.0 : 0x0307). Vérifiez l'arbre des périphériques avec l'application Informations sur le système et rechercher une chaîne de caractères appropriée.

Enveloppez tout cela dans une variable comme $SDDiskToErase et passez-la à votre diskutil eraseDisk commandement.

En utilisant la ligne ci-dessus légèrement modifiée, j'ai obtenu le diskIdentifier (disque2) d'un disque USB externe directement relié à mon Mac :

system_profiler -detailLevel mini | grep -A 30 0x1c26 | awk '/disk/ {gsub("BSD Name:", ""); print $NF}'
disk2

ioreg :

Une autre commande initiale est ioreg -l | grep … ( est similaire à celle ci-dessus) qui est beaucoup plus rapide (moins d'une seconde).

Attacher une carte SD et obtenir son DiskIdentifier avec diskutil list . Ensuite, faites un dump de ioreg avec ioreg -l > ~/Desktop/ioreg-dump.txt .

Cherchez dans ioreg-dump.txt l'identifiant du disque trouvé ci-dessus. Le disque est connecté à un contrôleur supérieur (celui de votre moniteur) visualisé par les longues "lignes" verticales et les courtes horizontales à gauche dans le fichier muet. Utilisez une chaîne caractéristique et unique du contrôleur comme un numéro de série, IOName, deviceID, etc. Choisissez ensuite un nombre de lignes successives pour -A suffisamment grand pour contenir l'identifiant du disque (par exemple disk6) mais suffisamment petit pour ne pas contenir les identifiants de volume (par exemple disk6s1).

Exemple :

ioreg -l | grep -A 350 0x100000214 | awk '/disk/ {gsub("\"",""); print $NF}'
disk2

Pour utiliser la commande dans le script d'Apple, vous devez échapper tous les éléments internes. " y \ :

"ioreg -l | grep -A 10 SD/MMC/MS/MSPRO | awk '/disk/ {gsub("\"",""); print $NF}'"

devient :

do shell script "ioreg -l | grep -A 10 SD/MMC/MS/MSPRO | awk '/disk/ {gsub(\"\\\"\",\"\"); print $NF}'"

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X