0 votos

Si el disco externo se encuentra por el terminal de Apple

Hey para los MacBooks tienen esta mala costumbre de no montaje de discos externos cuando se conecta antes de... enlace de referencia

la solución es bastante simple, con terminal de expulsar el disco y el manual desenchufe nos enchufamos la unidad.

Me gustaría hacer un pequeño AppleScript que puede hacer todo el proceso de buscar el disco y si lo encuentra lo expulsa. Esto es lo que tengo, pero estoy atascado en el reconocimiento de si el disco externo se encuentra la terminal de...

tell application "Terminal"
do script "echo \"diskutil list\"" in window 1
if exists disk2 then
    do script "echo \"diskutil info disk2\"" in window 1
    do script "echo \"diskutil eject disk2\"" in window 1
    do script "echo \"diskutil list\"" in window 1
end if
end tell

el error que me sale es La variable disk2 no está definido. las preguntas son: 1) si puedo imprimir la diskutil list, ¿cómo habría de definir las variables de todo el disco externo terminal encontrado? 2) a ver si es montado, si no de intentar montar, si se produce un error de expulsión?

1voto

qarma Puntos 71

En realidad estás escribiendo un script de shell, y el AppleScript contexto, parece más bien superflua en el momento. Si usted está predominantemente mediante comandos de shell, puede que desee considerar la posibilidad de escribir un script de shell en su lugar.

He empleado un poco de ambos, porque cada uno tiene su utilidad en esta situación: el shell de comandos son necesarios para recuperar la información del disco a través de diskutil, ya que AppleScript no tiene incorporado el medio de conseguir que la información por sí mismo; pero, a continuación, en lugar de meterse con grep, awko sed al patrón que coincida con el texto de la salida raw, podemos invocar el -plist opción para devolver la salida con formato XML de la lista de propiedades de datos, que AppleScript puede ser muy bueno en el manejo.

1. Recuperar una lista de los discos locales y volúmenes

Conectado localmente discos y volúmenes blockdevice inodo en la carpeta /dev, por lo que conseguir una lista de los discos es muy fácil con AppleScript:

use application "System Events"

property devices : a reference to files in folder "/dev"
property disknodes : a reference to (devices whose name begins with "disk")

set diskinfo to name of disknodes

Con mi disco USB conectado, me sale esta lista de inodos:

    --> {"disk0", "disk0s1", "disk0s2", "disk1", "disk1s1", 
         "disk1s2", "disk1s3", "disk1s4", "disk2", "disk2s1"}

2. Aislar los volúmenes deseados

Para filtrar la lista para que sólo se ejecute el correspondiente utilidades en el adecuado uso de los discos o volúmenes, diskutil ahora hace su parte. Podemos crear un proceso de shell desde el interior de AppleScript, en lugar de hacerlo a través de Terminal. El correspondiente comando de shell es este:

diskutil info -plist <disk|volume>

Para ejecutar este de AppleScript, el uso de la do shell script comando:

do shell script "diskutil info -plist" & id

donde id es el nombre de un disco recuperado de la anterior y se almacena en diskinfo. No se puede pasar en toda la lista de una vez, así que tenemos que recorrer la lista y ejecutar el comando una vez para cada elemento:

use scripting additions

delete every property list item
repeat with id in diskinfo
    set shellcmd to "diskutil info -plist " & id
    set plist to do shell script shellcmd

Con la propiedad de los datos de la lista devuelta por diskutil, AppleScript puede convertir en un property list objeto. La propiedad de los datos de la lista devuelta por la invocación diskutil info todo está contenido dentro de un único nivel, así que no hay jerarquía que las atraviesan. La gran cosa con property list objetos es que AppleScript puede transformar en un record, la cual llega a ser muy fácil para recuperar los valores:

    make property list item with properties {name:id, text:plist}
    tell the value of property list item id as record to if ¬
        (its |Ejectable|) and (not its WholeDisk) and ¬
        (its MountPoint = "") then set the contents of id ¬
        to its {disk:ParentWholeDisk, volume:DeviceIdentifier}
end repeat

En una sola línea, AppleScript ha leído la lista de propiedades de datos, y se descarta cualquier disco que es:

  1. No ejectable;
  2. Es un "todo" en el disco (es decir, no un montaje en volumen);
  3. Tiene una situación identificable punto de montaje en el sistema.

También contenedores de todos los datos inútiles que no necesitamos, y sólo devuelve el nombre de la partición y de su disco primario. Estos sólo se ejectable discos (por lo que no la recuperación y discos de arranque, y no en su disco duro del ordenador), y se pueda montar volúmenes que actualmente no están montados. Para mí, y mi sola unidad USB, lo que me desmonta en primer lugar, tengo esta lista de registro de nuevo:

set unmounted to records of diskinfo
    --> {{disk:"disk2", volume:"disk2s1"}}

3. Montaje y extracción de cada volumen

El análisis de los datos se hace ahora, por lo que ahora puede ejecutar diskutil operaciones en los discos apropiados. Usted tiene la opción de montaje de volúmenes individuales, o el montaje de un disco entero (el que se pueden montar todos los volúmenes). El método es el mismo para cada uno de ellos: iterar a través de nuestra lista de registro almacenado en la variable unmounted y el uso de la disk o de la volume de cada elemento como un argumento para el correspondiente comando de la shell:

diskutil mount <volume>
diskutil mountDisk <disk>
diskutil eject <disk>

El AppleScript bucle se parece a esto:

repeat with diskitem in unmounted
    set shellcmd to "diskutil mount " & diskitem's volume
    try
        do shell script shellcmd
    on error
        set shellcmd to "diskutil eject " & diskitem's disk
        try
            do shell script shellcmd
        end try
    end try
end repeat

do shell script devuelve en el éxito de la salida a stdout. Tras el éxito de montaje de mi disco, el panel de mensajes en el Editor de secuencias de Comandos contenidos:

"Volume USB on disk2s1 mounted"

Yo no he sido el impulsor de una situación en la que las fuerzas de mi unidad no montar, pero por lo general, tras el fracaso de cualquier comando del shell (es decir, cuando un comando de la shell devuelve un estado distinto de cero), do shell script lanza un error. Este va a ser capturado por la try bloque, que va a redirigir la secuencia de comandos para ejecutar otro comando de shell responsable de expulsión de la unidad. Esto también está en su propia try bloque en caso de que, también, devuelve un estado distinto de cero, en cuyo caso el script seguirá en el próximo volumen.

A continuación es el final de la secuencia de comandos con algunas modificaciones adicionales. El script devolverá el original desmontado lista de registro con información adicional anexa a cada elemento de disco de presentación de informes el resultado del intento de montar y/o expulsar el volumen. Un completo fracaso simplemente se informó con false. Así que mi script final el resultado se veía así:

--> {{disk:"disk2", volume:"disk2s1", result:"Volume USB on disk2s1 mounted"}}

El guión final

use application "System Events"

property devices : a reference to files in folder "/dev"
property disknodes : a reference to (devices whose name begins with "disk")

set diskinfo to name of disknodes

use scripting additions

delete every property list item
repeat with id in diskinfo
    set shellcmd to "diskutil info -plist " & id
    set plist to do shell script shellcmd
    make property list item with properties {name:id, text:plist}
    tell the value of property list item id as record ¬
        to if (its |Ejectable|) ¬
        and (not its WholeDisk) ¬
        and (its MountPoint = "") then set ¬
        id's contents to {disk:its ParentWholeDisk ¬
        , volume:its DeviceIdentifier ¬
        , result:missing value}
end repeat

set unmounted to records of diskinfo

repeat with diskitem in unmounted
    set shellcmd to "diskutil mount " & diskitem's volume
    try
        do shell script shellcmd
        set diskitem's result to the result
    on error
        set shellcmd to "diskutil eject " & diskitem's disk
        try
            do shell script shellcmd
            set diskitem's result to the result
        on error E
            set disk item's result to E
        end try
    end try
end repeat

return unmounted

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by: