Tomo nota de lo que @Allan ha dicho en su comentario debajo de tu pregunta.
Mientras que no tengo un retraso tan largo como 10 a 15 segundos usando la línea de comandos, me parece que es demostrable y consistentemente más lento (unos pocos segundos) de hacer clic en el icono de WiFi. No sé los subyacentes de las operaciones realizadas por networksetup
, pero me pregunto si se realiza un análisis de la red y cada vez que se realiza una solicitud para unirse a una nueva red, lo que puede explicar el retraso. Escaneado en red de las veces se puede estar influenciada por muchos factores, por lo que este retraso es probable que varían entre los usuarios en diferentes entornos. Esto es sólo hipótesis, sin embargo.
Me encantaría ser capaz de hacer un applescript que manualmente clics para cambiar las redes Wi-Fi
Te voy a dar dos secuencias de comandos.
1. Servicio de secuencias de comandos con AppleScriptObjC
La primera secuencia de comandos utiliza AppleScriptObjC a la interfaz con el sistema directamente y de control de la interfaz WiFi. Un resumen rápido, que me ampliar a continuación:
-
+ Robusto/fiable
-
+ Más rápido que
networksetup
-
+ No hay necesidad de introducir manualmente las contraseñas
-
+ No hay alteraciones visuales en la pantalla; opera en segundo plano
-
− Más lento que hacer clic en el icono de WiFi
-
○ SSID mayúsculas y minúsculas, toda la frase matching (se puede cambiar)
use framework "CoreWLAN"
property this : a reference to current application
property nil : a reference to missing value
property _1 : a reference to reference
property CWWiFiClient : a reference to CWWiFiClient of this
property NSPredicate : a reference to NSPredicate of this
to joinNetwork given name:ssid as text, password:pw as text : missing value
local ssid, pw
set |?| to NSPredicate's predicateWithFormat:("self.ssid ==[c] %@") ¬
argumentArray:{ssid}
tell CWWiFiClient's sharedWiFiClient()'s interface()
its setPower:true |error|:nil
set networks to {}
tell cachedScanResults() to if it ≠ missing value then ¬
set networks to filteredSetUsingPredicate_(|?|)
if the number of networks = 0 then set networks to ¬
(its scanForNetworksWithName:ssid |error|:nil)
set network to (allObjects() in networks)'s firstObject()
its associateToNetwork:network |password|:pw |error|:_1
set [success, E] to the result
if E ≠ missing value then return ¬
E's localizedDescription() ¬
as text
success
end tell
end joinNetwork
Tendría que llamar a la joinNetwork
controlador desde dentro de tu script así:
joinNetwork given name:"my network ssid", password:"Passw0rd1"
Este script será robusto y fiable (salvo alguna humanos error de mi parte, que me corrija si usted encuentra un error que he pasado por alto durante las pruebas). Se utiliza preferentemente en caché los resultados del análisis para conectarse a las redes; si no hay ninguno disponible, o el SSID especificado no aparecen cuando los resultados del análisis fueron los últimos en caché, se realizará un nuevo análisis de la red. Por lo tanto, si mi hipótesis acerca de la networksetup
es un factor que contribuye, este script será más rápido que el de la línea de comandos en la mayoría de carreras, pero puede tomar la misma cantidad de tiempo en el ocasional ejecutar cuando se ven obligados a hacer un análisis.
Uno de los beneficios es que, debido a que puede especificar una contraseña de red cuando se llama a la joinNetwork
de controlador, usted no tendrá que introducir manualmente al unirse a una nueva red.
El SSID-especificada por el name
de parámetro es sensible a las mayúsculas en ambas secuencias de comandos; la contraseña, obviamente, no lo es. El script de arriba, se ha elegido para realizar toda una concordancia de frase en el SSID, es decir, "mi red" no siempre va a unirse a una red que se llama "mi red"; la secuencia de comandos a continuación ha elegido para hacer una coincidencia aproximada, es decir, "net" se podría unirse a "mi red" o "mi red".
2. Interfaz de usuario de secuencias de comandos
Este segundo script es realmente la que usted solicitó: que se comunica con la interfaz de usuario para que haga clic en el WiFi icono de menú y, a continuación, seleccione la red (si aparece en la lista). Un resumen:
-
+ A pesar de ser una interfaz de usuario de secuencia de comandos, que no debe sufrir de las mismas debilidades inherentes a la mayoría de las secuencias de comandos de interfaz de usuario; así que espero fiable
-
+ Más rápido de la implementación de las redes unió inmediatamente
-
− Visualmente discordante cuando aparezca el menú; además, el usuario no debe interactuar con el sistema hasta que el script ha salido (de la naturaleza de la interfaz de usuario de secuencia de comandos)
-
− Debe introducir manualmente las contraseñas si no se ha guardado
-
○ SSID mayúsculas y minúsculas, de coincidencia aproximada (se puede cambiar)
use application "System Events"
property process : a reference to application process "SystemUIServer"
property menu bar : a reference to menu bar 1 of my process
property menu bar item : a reference to (menu bar items of my menu bar ¬
where the description contains "Wi-Fi")
property menu : a reference to menu 1 of my menu bar item
property menu item : a reference to menu items of my menu
to joinNetwork given name:ssid as text
local ssid
if not (my menu bar item exists) then return false
click my menu bar item
repeat until my menu exists
delay 0.5
end repeat
set M to a reference to (my menu item where the name contains ssid)
repeat 20 times --> 10 seconds @ 0.5s delay
if M exists then exit repeat
delay 0.5
end repeat
click M
end joinNetwork
joinNetwork given name:"my network ssid"
Secuencias de comandos que intente controlar la interfaz de usuario está utilizando un método llamado interfaz de usuario o GUI de secuencias de comandos. Estos son muy populares entre y popularizado por novato generadores de secuencias de comandos, simplemente porque estos son los más comúnmente encontrado secuencias de comandos en internet. No voy a entrar aquí demasiado distinto de advertir contra el uso de secuencias de comandos que dependen de clics y pulsaciones del teclado que son inherentemente frágil y poco fiable, incluso si está bien escrito, pero la mayoría de las secuencias de comandos de interfaz de usuario (escrito por novatos) son terriblemente escrito, lo que agrava el problema. Casi siempre hay una mejor manera de lograr el resultado deseado.
Dicho esto, este es uno de los pocos tipos de interfaz de usuario de secuencias de comandos que son tal vez una excepción a mi advertencia, y en mi opinión, bastante aceptable la aplicación. Esto es debido a que la orientación de un aspecto de la interfaz de usuario de un menú (el icono de la barra de propiedad por el sistema) que está prácticamente garantizado para siempre accesible, independientemente de lo que la ventana o el escritorio tiene el foco, etc. La situación en la que el guión de esta naturaleza podría romper es si el menú del icono de la barra no estaba allí (es decir, que el usuario específicamente establecer una preferencia que no tiene el icono de WiFi disponible); sin embargo, he de poner una línea en el script que comprueba la existencia de este, y realiza una salida airosa de la situación.
Esta secuencia de comandos que parece ser rápidas de ejecución, lo cual no me sorprende, ya que será igual en velocidad a hacer clic en el icono manualmente; pero, lo que me impresiona en que no puedo pensar en muchas secuencias de comandos de interfaz de usuario que acabaría fuera la realización de una aplicación o servicio dirigida a la secuencia de comandos. La red está unido de forma casi instantánea, siempre que la contraseña ya está guardado en su llavero. En la ocasión, la red se esperaría ver en el menú de la lista pueden no estar ahí hasta el análisis en segundo plano, refresca y la lista de actualizaciones. Por lo tanto, he construido en un espacio de 10 segundos dentro de los cuales el script comprueba cada medio segundo para ver si el elemento de menú que ha aparecido; si no, la secuencia de comandos de salidas y tendrás que intentarlo de nuevo.
El inconveniente es la ausencia de un llavero de la contraseña de una red se requieren de tener que introducir manualmente la contraseña cuando se le solicite. Esto es posible secuencia de comandos de esta con interfaz de usuario técnicas, pero inmediatamente hace que la secuencia de comandos altamente susceptibles a los problemas que he mencionado y, a continuación, yo, personalmente, no lo uso.
Sistema de información: AppleScript versión: 2.7 Sistema de versión: 10.13.6