Applescript Convalida chiavetta USB - Corrispondenza seriale e punto di montaggio

2

Voglio essere sicuro che la chiavetta USB su 'usbMountPoint' sia anche quella con il 'usbSerialNumber' corrispondente

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

Durante la convalida per verificare se usbMountPoint e usbSerialNumber esistono in system_profiler, il codice dovrebbe verificare se il dispositivo USB su 'usbMountPoint' ha il numero seriale di 'usbSerialNumber'. Senza questo "abbinamento / abbinamento", l'utente potrebbe semplicemente avere due USB collegate: una con il numero seriale corretto, l'altra con lo script; mentre il codice restituirà "Trovato" perché "contiene" legge l'intero system_profiler senza verificare che entrambe le variabili provengano dallo stesso dispositivo.

Qualsiasi aiuto sarebbe molto apprezzato. Cin cin.

    
posta ProGrammer 18.12.2016 - 00:08
fonte

1 risposta

1

Ovviamente non conosco lo scopo complessivo di ciò che stai cercando di ottenere, poiché poiché lo hai attualmente codificato, lo script potrebbe essere eseguito da un altro dispositivo USB di destinazione. Quindi l'ho scritto in modo un po 'diverso, tuttavia ha il mount point basato sul numero seriale se è montato l'USB Drive di destinazione. È quindi possibile diramare in base alle condizioni, ovvero se lo script è in esecuzione dall'unità USB di destinazione o meno e se l'unità USB di destinazione è montata o meno, ecc. Dopo aver ottenuto il punto di montaggio nel < em> code , ho incluso un altro blocco di code per testarlo se l'unità USB di destinazione è montata e da dove è stato eseguito lo script. Questo ovviamente è solo un esempio di test e dovrai fare quello che ti serve. La linea di fondo qui è, come ho codificato ottenendo il mount point dell'unità USB di destinazione in base al numero seriale e questo immagino che sia ciò che stai davvero cercando.

Ecco la mia versione del codice e viene emessa quando viene eseguita sia dal desktop che dall'unità USB di destinazione:

  • Nota: prima dell'uso, modifica il numero seriale sottostante al valore appropriato.

Codice 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

Risposte durante l'esecuzione dall'unità USB di destinazione:

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

Risposte eseguite dal desktop con l'unità USB di destinazione connessa:

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

Risposte quando si esegue dal desktop senza l'unità USB di destinazione connessa:

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

Capire cosa sta facendo la riga di comando set usbMountPoint to (do shell script "...") as text per impostare il valore della usbMountPoint variabile .

  • system_profiler SPUSBDataType | restituisce tutte le informazioni relative all'hardware USB e viene quindi inviato alla prima occorrenza di awk nella riga di comando.
  • awk '/" & usbSerialNumber & "/' RS= | cerca il numero seriale e visualizza tutto dalla prima riga vuota prima il numero seriale e la prima riga vuota dopo il numero di serie e il suo output viene quindi inviato alla seconda occorrenza di awk nella riga di comando. Ciò garantisce che l'unica riga contenente ' /Mount Point: ' nell'output sia associata al numero seriale (se è installata l'unità USB di destinazione).
  • awk -F': ' '/Mount Point: /{print $2}' trova la riga contenente 'Mount Point: ' , quindi usa ': ' come separatore di campi e stampa il secondo campo che sarà il percorso POSIX del punto di montaggio dell'unità USB di destinazione, o '' come in nulla (perché non è stato montato).
risposta data 19.12.2016 - 21:07
fonte

Leggi altre domande sui tag