1 votos

Incrustar un script ruby en AppleScript

He hecho una carpeta acción AppleScript que principalmente recibe el nombre de la carpeta con la ruta de la carpeta y llama a un script de ruby con la ruta de acceso, como el argumento. Este funciona perfectamente, pero hay una manera de poner este rubí archivo dentro de la AppleScript como una variable, así que no tengo que lidiar con dos archivos?

Soy nuevo en esto así que si se proporciona un ejemplo sería genial. Gracias.

Estoy intentando el código que se indican a continuación, pero recibiendo un error "-e:82: error de sintaxis, el inesperado final de la entrada, esperando keyword_end" número 1.

Según las instrucciones, he copiado el archivo y se inserta el escape \ personaje, no se ha cambiado ningún código. la tercera línea de comentarios va a ejecutar el programa sin ningún error.

set folder_name to quoted form of "/Volumes/HackSSD/Testing Space"

display dialog folder_name

--set makeDateFolders to "/Users/raj/Documents/ivfolders.rb " & folder_name

set rubyScript to "# ivfolder.rb
require 'set'
require 'benchmark'
require 'date'
require 'fileutils'
require 'open3'

raise ArgumentError, 'Expecting single command-line value' if ARGV.length > 1

def file_created_date(ivfile)
  # Not all images have a uniform EXIF/IPTC tag name for created date/time.
  # Use exiftool if installed and attempt three different date tags. If these
  # find no creation date, return the System creation date.
  # returns created_date as 'yyyy-mm-dd' string

  exiftool = '/usr/local/bin/exiftool'
  create_date = ''

  if File.exist?(exiftool)
    create_date, = Open3.capture2(exiftool, '-s3', '-d', '%F',
                                  '-DateTimeOriginal',
                                  '-FileModifyDate',
                                  '-CreateDate',
                                  ivfile)[0]

    if create_date && create_date.count(\"\\n\") > 1
      # n-tuple dates found, usually the same, but take oldest if present.
      datestr = create_date.split(\"\\n\").min
    elsif create_date
      # one date, likely the FileModifyDate. Remove trailing newline
      datestr = create_date.chomp
    end
    return datestr unless create_date.empty?
  end
  File.birthtime(ivfile).strftime('%F') if create_date.empty?
end

# check folder name to see if it is in YYYY-MM-DD format
def valid_date?(str, format = '%F')
  Date.strptime(str, format)
rescue ArgumentError
  false
end


# file excluded if not in this set.
extensions = Set.new(['.cr2', '.cr3', '.nef', 'dng', '.arw', '.gif', '.jpg',
                      '.jpeg', '.jp2', '.png', '.ai', '.psd', '.svg', '.tif',
                      '.tiff', '.heic', '.heif', '.mp4', '.hevc', '.mov',
                      '.m4v', '.avi', '.mts', '.mpg'])

folders = Set.new
matched_files = Set.new
filecnt = 0
foldercnt = 0

elapsed = Benchmark.realtime do
  start_folder = File.expand_path(ARGV.first)

  Dir.chdir(start_folder) do
    Dir.glob(\"#{start_folder}/*.*\").select do |f|
      matched_files << f if extensions.include?(File.extname(f.downcase))
    end

    # if previous run, collect existing folders matching yyyy-mm-dd
    Dir.glob(\"#{start_folder}/*\").select do |f|
      z = File.basename(f)
      folders << z if valid_date?(z) && z.length == 10
    end

    matched_files.each do |f|
      # create_date = File.birthtime(f).strftime('%F') # yyyy-mm-dd
      create_date = file_created_date(f)
      FileUtils.mkdir(create_date, mode: 0o0755, verbose: false) 
                unless folders.include?(create_date)
      folders << create_date
      FileUtils.mv(File.basename(f), create_date, verbose: false)
    end
    filecnt = matched_files.count
    foldercnt = folders.count
  end
end"

do shell script ("ruby -e " & (quoted form of rubyScript) & space & folder_name) -- run it

En mi carpeta de secuencia de comandos de acción que está trabajando bien estoy tomando el cuidado de cuando la carpeta de la acción se desencadena una vez que se crea una carpeta, el guión de trabajo que se dan a continuación. Como se mencionó anteriormente quiero incrustar el script de ruby no molestarse con un archivo externo. La Carpeta De Trabajo De Action Script

on adding folder items to this_folder after receiving added_items
    try


        repeat with theCurrent_item in added_items
            set filePosixPath to quoted form of (POSIX path of (theCurrent_item as alias))
            set fileType to (do shell script "file -b " & filePosixPath) --Test if it is a directory
            if fileType = "directory" then
                return
            end if

        end repeat


        set folder_name to quoted form of (POSIX path of (this_folder as alias))

        set makeDateFolders to "/Users/raj/Documents/ivfolders.rb " & folder_name


        do shell script makeDateFolders

    end try
end adding folder items to

2voto

red_menace Puntos 111

Un script en Ruby puede ser colocado en un AppleScript cadena para su uso con do shell script, pero tenga en cuenta que los caracteres especiales en la cadena, tales como barra diagonal inversa comillas dobles y habrá escapado con una barra invertida. Hay un par de arreglos diferentes que usted puede usar, mi preferencia es aquí el documento, por ejemplo:

on run -- Script Editor or application double-clicked
    doStuff for (choose file with multiple selections allowed)
end run

on open theFiles -- items dropped onto the application
    doStuff for theFiles
end open

on adding folder items to this_folder after receiving these_items -- folder action
    doStuff for these_items
end adding folder items to

to doStuff for someFiles
    set argString to "" -- create an argument string from the item list
    repeat with anItem in someFiles -- quote and separate
        set anItem to POSIX path of anItem
        set argString to argString & quoted form of anItem & space
    end repeat

    set heredoc to "<<-SCRIPT
# place your (escaped for AppleScript strings) code here, for example:
ARGV.each_with_index do |arg, index|
  puts \"Argument #{index}:  #{arg}\"
end
SCRIPT"

    set scriptResult to (do shell script "/usr/bin/env ruby - " & argString & heredoc) -- run it
    return paragraphs of scriptResult -- or whatever
end doStuff

El -e opción también puede ser usado en lugar de aquí el documento (véase el Rubí hombre de la página), por ejemplo:

    set rubyScript to "# place your (escaped for AppleScript strings) code here, for example:
ARGV.each_with_index do |arg, index|
  puts \"Argument #{index}:  #{arg}\"
end"

    set scriptResult to (do shell script "/usr/bin/env ruby -e " & (quoted form of rubyScript) & space & argString) -- run it

0voto

Steve Evans Puntos 155

do shell script

Usted debe utilizar el AppleScript comando do shell script. Este comando se puede ejecutar un comando externo o ejecutar un citada secuencia de comandos.

Apple proporcionar este ejemplo para perl incrustado en AppleScript:

set mySlug to do shell script ¬
    "perl -e 'my (undef, undef, undef, $d, $m, $y) = localtime;
              my $date = sprintf("%4d-%02d-%02d", $y+1900, $m+1, $d);
              print $date'"

Ver también Cómo ejecutar una secuencia de comandos de shell de un AppleScript?

0voto

Raj Khandwala Puntos 9

Durante la semana pasada estuve buscando en la web para mi solución y me encontré con ExifTool. es un programa que permite examinar y escribir los metadatos de diferentes tipos de archivos. He resuelto el programa de 2 maneras

  1. Applescript
on adding folder items to this_folder after receiving added_items
    try

        repeat with theCurrent_item in added_items
            set filePosixPath to quoted form of (POSIX path of (theCurrent_item as alias))
            set fileType to (do shell script "file -b " & filePosixPath) --Test if it is a directory
            if fileType = "directory" then
                return
            end if

        end repeat


        set folder_name to quoted form of (POSIX path of (this_folder as alias))

        set ExifTool to "/usr/local/bin/exiftool  '-directory<CreateDate'  -d %Y-%m-%d "
        do shell script "cd " & folder_name & "; " & ExifTool & folder_name

    end try
end adding folder items to
  1. Secuencia De Comandos De Shell en Automator creado un nuevo flujo de trabajo para la carpeta de la acción y la arrastró a la acción para ejecutar la secuencia de comandos de shell (/bin/bash) a la derecha y ponemos el siguiente código
f=$(dirname "${1}") #Get directory path will put a code to see that it is a file and not a folder
cd "$f"

/usr/local/bin/exiftool '-Directory<CreateDate' -d %Y-%m-%d $f

Ambas obras Por el camino a la hora de poner cualquier tipo de archivo multimedia en la carpeta en la que se va a crear un directorio AAAA-MM-DD si no se presenta y mover el archivo basándose en la información Exif CreateDate etiqueta, que es el tiempo de la imagen o el video fue filmado.

Gracias a todos por sus valiosas aportaciones.

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:

X