2 votes

Applescript Validant une clé USB - Correspondance entre le numéro de série et le point de montage

Je veux être sûr que la clé USB qui se trouve à 'usbMountPoint' est aussi celle qui a le 'usbSerialNumber' correspondant.

-- Get Mount Point of script's USB host
tell application "Finder"
   try
       set usbMountPoint to text 1 thru -2 of POSIX path of (disk of (path to me) as alias)
       log usbMountPoint --> Output: /Volumes/usb-drive-name
   on error
       set usbMountPoint to POSIX path of (disk of (path to me) as alias) --> if file is on desktop, path: '/', can't have ' ' hence no removing
       log usbMountPoint --> Output: /Volumes/usb-drive-name
   end try
end tell

-- Set Serial Num of USB Stick
set usbSerialNumber to "C86000BDB9F2BFA04A31E8A1"

-- Check if usbMountPoint and usbSerialNumber exist
set sysProfileUSB to (do shell script "system_profiler SPUSBDataType") as text
if sysProfileUSB contains "Serial Number: " & usbSerialNumber and sysProfileUSB contains "Mount Point: " & usbMountPoint then
   log "USB Stick Found!"
else
   log "USB Stick Not found."
end if

Lors de la validation pour vérifier si usbMountPoint et usbSerialNumber existent dans system_profiler, le code doit vérifier si le périphérique USB à 'usbMountPoint' a le numéro de série de 'usbSerialNumber'. Sans cette "correspondance/appariement", l'utilisateur pourrait simplement avoir deux USB connectés - l'un avec le bon numéro de série, l'autre avec le script ; alors que le code retournera "Found" parce que "contains" lit tout le system_profiler sans valider que les deux variables proviennent du même dispositif.

Toute aide serait grandement appréciée. Merci.

1voto

user3439894 Points 52496

Bien sûr, je ne connais pas l'étendue totale de ce que vous essayez d'accomplir, mais comme vous l'avez actuellement codé, l'écran de l'ordinateur de l'entreprise n'a pas été modifié. script pourrait être exécuté à partir d'une autre source que le lecteur USB cible. J'ai donc écrit la commande un peu différemment, mais elle obtient le résultat suivant point de montage sur la base de la numéro de série si le lecteur USB cible est monté. Vous pouvez alors vous brancher en fonction des conditions, c'est-à-dire si le script est exécuté depuis le lecteur USB cible ou non et si le lecteur USB cible est monté ou non, etc. Après avoir obtenu le point de montage dans le code j'ai inclus un autre bloc de code pour tester si la clé USB cible est montée et d'où le script a été exécuté. Ceci n'est évidemment qu'un exemple de test et vous devrez faire ce dont vous avez besoin. La ligne de fond ici est, comment j'ai codé l'obtention de l'option point de montage du lecteur USB cible en fonction de la numéro de série et je suppose que c'est ce que tu cherches vraiment.

Voici mon point de vue sur le code et son résultat lorsqu'il est exécuté à partir du bureau et de la clé USB cible :

  • Remarque : avant de l'utiliser, changez le numéro de série ci-dessous à la valeur appropriée.

Code AppleScript :

--    # Get the volume this script is located on.

tell application "Finder"
    try
        set theVolumeThisScriptIsLocatedOn to text 1 thru -2 of POSIX path of (disk of (path to me) as alias)
        log "The volume this script is located on is: " & quoted form of theVolumeThisScriptIsLocatedOn
    on error
        set theVolumeThisScriptIsLocatedOn to POSIX path of (disk of (path to me) as alias)
        log "The volume this script is located on is: " & quoted form of theVolumeThisScriptIsLocatedOn
    end try
end tell

--    # Set the Serial Number of the target USB Drive.

set usbSerialNumber to "200434112111BA425FA4"

--    # See if the USB Drive matching 'usbSerialNumber' is mounted and if so, get its mount point.
--    # The variable 'usbMountPoint' will contain either its mount point, e.g., '/Volumes/...', or '' as in nothing.

set usbMountPoint to (do shell script "system_profiler SPUSBDataType | awk '/" & usbSerialNumber & "/' RS= | awk -F': ' '/Mount Point: /{print $2}'") as text
log "The mount point is: " & quoted form of usbMountPoint
if usbMountPoint is equal to "" then
    log "The target USB Drive is not mounted!"
else
    log "The target USB Drive is mounted!"
end if

--    # See if the script is running from the target USB Drive or elsewhere.

if usbMountPoint is not equal to "" and theVolumeThisScriptIsLocatedOn is equal to usbMountPoint then
    log "This script is running from the target USB Drive!"
else
    log "This script is not running from the target USB Drive!"
end if

Réponds lorsqu'il est exécuté à partir du lecteur USB cible :

tell current application
    path to current application
        --> alias "16GB-USB:USB Test.scpt"
end tell
tell application "Finder"
    get disk of alias "16GB-USB:USB Test.scpt"
        --> alias "16GB-USB:"
    (*The volume this script is located on is: '/Volumes/16GB-USB'*)
end tell
tell current application
    do shell script "system_profiler SPUSBDataType | awk '/200434112111BA425FA4/' RS= | awk -F': ' '/Mount Point: /{print $2}'"
        --> "/Volumes/16GB-USB"
    (*The mount point is: '/Volumes/16GB-USB'*)
    (*The target USB Drive is mounted!*)
    (*This script is running from the target USB Drive!*)
end tell

Réponses lorsqu'elles sont exécutées à partir du bureau avec le lecteur USB cible connecté :

tell current application
    path to current application
        --> alias "Macintosh HD:Users:me:Desktop:USB Test.scpt"
end tell
tell application "Finder"
    get disk of alias "Macintosh HD:Users:me:Desktop:USB Test.scpt"
        --> alias "Macintosh HD:"
end tell
tell current application
    path to current application
        --> alias "Macintosh HD:Users:me:Desktop:USB Test.scpt"
end tell
tell application "Finder"
    get disk of alias "Macintosh HD:Users:me:Desktop:USB Test.scpt"
        --> alias "Macintosh HD:"
    (*The volume this script is located on is: '/'*)
end tell
tell current application
    do shell script "system_profiler SPUSBDataType | awk '/200434112111BA425FA4/' RS= | awk -F': ' '/Mount Point: /{print $2}'"
        --> "/Volumes/16GB-USB"
    (*The mount point is: '/Volumes/16GB-USB'*)
    (*The target USB Drive is mounted!*)
    (*This script is not running from the target USB Drive!*)
end tell

Réponses lorsqu'elles sont exécutées à partir du bureau sans le lecteur USB cible connecté :

tell application "Finder"
    get disk of alias "Macintosh HD:Users:me:Desktop:USB Test.scpt"
        --> alias "Macintosh HD:"
end tell
tell current application
    path to current application
        --> alias "Macintosh HD:Users:me:Desktop:USB Test.scpt"
end tell
tell application "Finder"
    get disk of alias "Macintosh HD:Users:me:Desktop:USB Test.scpt"
        --> alias "Macintosh HD:"
    (*The volume this script is located on is: '/'*)
end tell
tell current application
    do shell script "system_profiler SPUSBDataType | awk '/200434112111BA425FA4/' RS= | awk -F': ' '/Mount Point: /{print $2}'"
        --> ""
    (*The mount point is: ''*)
    (*The target USB Drive is not mounted!*)
    (*This script is not running from the target USB Drive!*)
end tell

Comprendre ce que le set usbMountPoint to (do shell script "...") as text La ligne de commande permet de définir le valeur de la usbMountPoint variable .

  • system_profiler SPUSBDataType | sort toutes les informations relatives au matériel USB et est ensuite acheminé vers la première occurrence de awk dans la ligne de commande.
  • awk '/" & usbSerialNumber & "/' RS= | cherche le numéro de série et sort tout ce qui se trouve sur la première ligne vide avant le site numéro de série et la première ligne vierge après le site numéro de série et sa sortie est ensuite acheminée vers la deuxième occurrence de awk dans la ligne de commande. Cela garantit que la seule ligne contenant ' /Mount Point: dans la sortie est associé à l'élément numéro de série (si le lecteur USB cible est monté).
  • awk -F': ' '/Mount Point: /{print $2}' trouve la ligne contenant 'Mount Point: ' puis utilise ': ' comme séparateur de champ et imprime le deuxième champ qui sera soit le nom de chemin POSIX du point de montage du lecteur USB cible, soit '' comme dans rien (parce qu'il n'a pas été monté).

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