Monte automaticamente uma unidade de rede e copie um arquivo para uma pasta de rede (AppleScript) -- acos campo com applescript campo com network campo com file-transfer camp apple Relacionado O problema

Automatically Mount a Network Drive and Copy a File to a Network Folder (AppleScript)


4
vote

problema

português

Eu tenho uma tarefa bastante complexa para resolver. Eu não uso o OS X, mas agora eu tenho que fornecer alguns colegas com um aplicativo simples que copia automaticamente um determinado arquivo para uma pasta de rede. Normalmente eu usaria um script de shell, mas alguma GUI mínima é uma coisa obrigatória neste caso. Então eu pensei que poderia usar o AppleScript.

Eu teria que executar estas etapas:

    .
  1. conectar a uma unidade de rede ( smb://myserver/public , onde cada usuário tem diferentes nomes de login e senhas, portanto, fiação dos nomes de usuários e senhas no código não é uma opção).
  2. Navegar para uma pasta na unidade de rede (cada usuário tem uma pasta diferente na unidade de rede).
  3. copie um determinado arquivo da área de trabalho do usuário para a pasta aberta na unidade de rede.

Então, quando executando o script, o usuário tem que inserir seu nome de usuário e senha para conectar a unidade de rede, e o usuário deve inserir o nome da pasta que eles devem copiar o arquivo. O nome da pasta pode ser armazenado permanentemente de alguma forma? Portanto, o usuário não terá que inserir o nome da pasta a cada vez quando ele for executado este script. Mas, a partir do tempo, essas pastas podem mudar, então tem que haver uma opção para alterar a pasta antes de copiar. Também como posso verificar se a unidade de rede já está montada, para que o usuário não seja solicitado para nome de usuário e senha toda vez que ele ou ela executa este script?


Aqui está o quão longe eu consegui continuar a montar um script para realizar essa tarefa:

Estou lutando para entender como o Applescript gosta de armazenar um caminho para um arquivo / pasta em uma unidade de rede montada.

Então aqui é o que eu tenho agora:

  property userName : "myfolder" property folderName : "myusername"  property serverName : "public" property serverAddress : "smb://myserver/public" property serverStatus : 0  on connectToServer()     global userName     global folderName     global serverName     global serverAddress     global serverStatus      set mountedDisks to list disks     if mountedDisks does not contain serverName then         mount volume serverAddress as user name userName with password (display dialog "Enter password for" & quoted form of serverName with title "" default answer "" giving up after 3 with hidden answer)     end if      set mountedDisks to list disks     if mountedDisks contains serverName then         set serverStatus to 1     else         connectToServer()     end if end connectToServer  on mainLoop()     global userName     global folderName     global serverName     global serverAddress     global serverStatus      if serverStatus is equal to 0 then         connectToServer()     end if      set mainDialog to display dialog ¬         "Your username: " & userName & " Your folder's name: " & folderName buttons {"Quit", "Settings", "Copy file"} with title "File Copier" default button 1     set mainDialogAnswer to button returned of mainDialog      if mainDialogAnswer is equal to "Quit" then         quit     end if      if mainDialogAnswer is equal to "Settings" then         display dialog "Enter your username" with title "Step 1 of 2" default answer userName         set userName to {text returned of result}          display dialog "Enter your folder's name" with title "Step 2 of 2" default answer folderName         set folderName to {text returned of result}          mainLoop()     end if      if mainDialogAnswer is equal to "Copy" then         -- copy the file     end if end mainLoop  mainLoop()    
english

I've a rather complex task to solve. I don't use OS X, but now I have to provide some colleagues with a simple application that automatically copies a certain file to a network folder. Normally I'd use a shell script, but some minimal GUI is a must-have thing in this case. So I thought I could use AppleScript.

I'd have to perform these steps:

  1. Connect to a network drive (smb://myserver/public, where every user has different login names and passwords, so wiring the usernames and passwords in the code is not an option).
  2. Navigate to a folder on the network drive (every user has a different folder on the network drive).
  3. Copy a certain file from the user's desktop to the opened folder on the network drive.

So when running the script the user has to enter his or her username and password for connecting the network drive, and the user has to enter the name of the folder they should copy the file to. Can the name of the folder be stored permanently somehow? So the user won't have to enter the folder name each time when he or she runs this script. But from time-to-time these folders may change, so there has to be an option to change the folder before copying. Also how can I check if the network drive is already mounted, so the user won't be asked for username and password each time he or she runs this script?


Here is how far I've been able to go in assembling a script to accomplish this task:

I'm struggling to understand how AppleScript likes to store a path to a file/folder on a mounted network drive.

So here is what I have now:

property userName : "myfolder" property folderName : "myusername"  property serverName : "public" property serverAddress : "smb://myserver/public" property serverStatus : 0  on connectToServer()     global userName     global folderName     global serverName     global serverAddress     global serverStatus      set mountedDisks to list disks     if mountedDisks does not contain serverName then         mount volume serverAddress as user name userName with password (display dialog "Enter password for" & quoted form of serverName with title "" default answer "" giving up after 3 with hidden answer)     end if      set mountedDisks to list disks     if mountedDisks contains serverName then         set serverStatus to 1     else         connectToServer()     end if end connectToServer  on mainLoop()     global userName     global folderName     global serverName     global serverAddress     global serverStatus      if serverStatus is equal to 0 then         connectToServer()     end if      set mainDialog to display dialog xc2xac         "Your username: " & userName & " Your folder's name: " & folderName buttons {"Quit", "Settings", "Copy file"} with title "File Copier" default button 1     set mainDialogAnswer to button returned of mainDialog      if mainDialogAnswer is equal to "Quit" then         quit     end if      if mainDialogAnswer is equal to "Settings" then         display dialog "Enter your username" with title "Step 1 of 2" default answer userName         set userName to {text returned of result}          display dialog "Enter your folder's name" with title "Step 2 of 2" default answer folderName         set folderName to {text returned of result}          mainLoop()     end if      if mainDialogAnswer is equal to "Copy" then         -- copy the file     end if end mainLoop  mainLoop() 
           
   
   

Lista de respostas

3
 
vote
vote
Melhor resposta
 

Cópia de arquivos no AppleScript é melhor feito através de Eventos do sistema ou , usando o comando duplicate … to , i.e.

  tell application "System Events" to duplicate sourceFile to targetFolder    

Onde ambos sourceFile e targetFolder precisa ser o tipo de objeto correto para o aplicativo usado - significa item de disco ou item do localizador (ambos os objetos podem ser criados a partir de objetos do AppleScript ALIAS ou caminhos textuais com uma coerção de tipo - eu adicionaria os detalhes, mas você não declarou como os caminhos para ambos são armazenados / adquiridos em seu script).

Algumas notas no seu código:

  • Não há necessidade de usar o Globals quando você já as definiu como propriedades. As propriedades do AppleScript são script scoped e persistem na execução - eles são redefinidos somente quando o script é recompilado. Se você atribuir aqueles que necessitam de configuração do usuário missing value ao declarar, você pode até verificar se eles já estão definidos e pule re-solicitando o usuário (haveria uma solução ainda mais confortável e segura se a Apple não houver t Descapcionado Keychain Access Scripting).
  • Não há necessidade de atribuições repetidas e chamada recursiva no seu manipulador ABCDEFGHIJKLMNABCDEFGHIJKLMN5 O seguinte código

      set timeOutCounter to 0 repeat while (list disks) does not contain serverName and timeOutCounter is less than timeOutInterval     -- mount drive     delay someInterval -- recommended, so you don’t hectically loop     set timeOutCounter to timeOutCounter + someInterval -- time out loop  end repeat    

    tentará se conectar no intervalo definido por someInterval , até que a montagem esteja disponível ou timeOutInterval seja atingido (assumindo que esses valores são declarados. Como propriedades, melhor - veja acima).

  • Você também pode querer oferecer sua maneira mais confortável de selecionar a pasta de destino do que digitar um nome de pasta da memória. Confira Adições padrão 's AppleScript Dictionary para o comando choose folder .
  • Finalmente, mas isso é principalmente uma questão de gosto e estilo de codificação, prefiro mover o comando tell application "System Events" to duplicate sourceFile to targetFolder 0 em seu próprio manipulador e chamar isso, se necessário repetidamente, do corpo do script, do que Use um estilo C tell application "System Events" to duplicate sourceFile to targetFolder 1 manipulador. Eu descobri que, em geral, o AppleScript fica fora do espaço de pilha facilmente quando a queda e pode ficar muito confuso sobre atribuições variáveis, por isso é uma boa ideia evitar construções recursivas onde não são necessárias.
 

Copying of files in Applescript is best done either through System Events or Finder, using the duplicate xe2x80xa6 to command, i.e.

tell application "System Events" to duplicate sourceFile to targetFolder 

where both sourceFile and targetFolder need to be the correct object type for the application used xe2x80x93 meaning disk item or finder item (both objects can be created from AppleScript alias objects, or textual path values with a bit of type coercion xe2x80x93 Ixe2x80x99d add the details, but you have not stated how the paths to both are stored / acquired in your script).

A few notes on your code:

  • There is no need to use globals when you have defined them as properties already. AppleScript properties are script scoped and persist across execution xe2x80x93 they are only reset when the script is recompiled. If you assign those that need user setting missing value when declaring, you can even check if they are already set and skip re-prompting the user (there would be an even more comfortable and secure solution if Apple hadnxe2x80x99t deprecated Keychain Access Scripting).
  • There is no need for the repeated assignments and recursive call in your connectToServer() handler. The following code

    set timeOutCounter to 0 repeat while (list disks) does not contain serverName and timeOutCounter is less than timeOutInterval     -- mount drive     delay someInterval -- recommended, so you donxe2x80x99t hectically loop     set timeOutCounter to timeOutCounter + someInterval -- time out loop  end repeat 

    will try to connect in the interval defined by someInterval, until the mount is available or timeOutIntervalis reached (assuming these values are declared. As properties, best xe2x80x93 see above).

  • You might also want to offer your user a more comfortable way of selecting the target folder than typing a folder name from memory. Check out Standard Additionsxe2x80x99s AppleScript dictionary for the choose folder command.
  • Finally, but that is mainly a matter of taste and coding style, Ixe2x80x99d rather move the display dialog command into its own handler and call that, if needed repeatedly, from the script body, than use a C style mainLoop handler. Ixe2x80x99ve found that, generally speaking, AppleScript runs out of Stack space easily when recursing and can get very confused about variable assignments, so it is a good idea to avoid recursive constructs where they are not necessary.
 
 
   
   

Perguntas relacionadas

1  Transferir e-comprado Kindle E-books  ( Transfer non purchased kindle e books ) 
Eu tenho um velho iPad mini com o aplicativo Kindle que meu irmão baixou e-books. Agora eu tenho um novo iPad mini 4 e não consigo transferir os livros para e...

10  Erro -36 "Alguns dados não podem ser lidos ou gravados" ao copiar arquivos do cartão SD  ( Error 36 some data cant be read or written when copying files from sd card ) 
Eu quero copiar arquivos do meu cartão SD para a minha área de trabalho, mas para alguns dos arquivos que recebo: . O Finder não pode concluir a operação po...

4  "Operação não pode ser concluída porque o item com nome já existe" erro com o paragon ntfs  ( Operation cant be completed because item with name already exists error with ) 
Eu reinstalei o Mac OS X El Capitan 10.11.5 no meu 2013 MacBook Pro, hoje, e eu tenho tido um problema copiando arquivos da unidade externa formatada NTFS usa...

1  Como trocar arquivos de texto simples com mensagens, whatsapp com qualquer destinatário  ( How to exchange simple text files with messages whatsapp with any recipient ) 
Eu freqüentemente tenho que enviar arquivos de texto simples para destinatários trabalhando no Mac, iPhone, PC executando o Linux, Windows, Mobile Running And...

2  Transfira imagens para iPad de um segundo computador  ( Transfer images to ipad from a second computer ) 
Eu estarei viajando neste fim de semana e eu estarei carregando meu ipad, assim como meu laptop de escritório. Agora, o iPad está definido para sincronizar co...

0  Como transferir o arquivo (PDF) do iMac para iPhone quando não há Internet  ( How to transfer file pdf from imac to iphone when no internet ) 
Alguém sabe de qualquer software que me permitirá enviar um PDF do meu iMac para o iPhone 5 quando não tenho Internet por favor? ...

3  ICHAT: Velocidades / portas de transferência muito lentas  ( Ichat very slow transfer speeds port restricted ) 
Eu tenho uma conexão de 12Mbps, então sei que minhas transferências de iChat devem ser super rápidas. Quando recebo arquivos de algumas pessoas, minha taxa de...

1  Automator: Mova os arquivos para uma nova subpasta com base no nome do arquivo  ( Automator move files into new subfolder based on files name ) 
Isenção de responsabilidade, isso pode não ser algo automator pode fazer. Eu tenho um grande diretório de arquivos de filmes. Para usar um software, cada fi...

4  Monte automaticamente uma unidade de rede e copie um arquivo para uma pasta de rede (AppleScript)  ( Automatically mount a network drive and copy a file to a network folder applesc ) 
Eu tenho uma tarefa bastante complexa para resolver. Eu não uso o OS X, mas agora eu tenho que fornecer alguns colegas com um aplicativo simples que copia aut...

1  Desaceleração do computador geral ao transferir arquivos  ( General computer slow down while transfering files ) 
Eu freqüentemente preciso transferir arquivos entre 10 GB e 1 TB como parte do meu trabalho, normalmente entre drives externos e servidores de rede. Sempre qu...




© 2022 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.