как использовать яблочный скрипт вычислить список размеров тома? - PullRequest
0 голосов
/ 12 октября 2018

Мне нужно выяснить, сколько на МНОГО жестких дисков - более 150 USB и Thunderbolt.Я думал, что смогу создать действие AppleScript или automator, чтобы получить общий размер тома и вычесть «доступный».В идеале я мог бы запустить скрипт, он бы наблюдал за монтируемым томом, делал эту математику и добавлял ее к промежуточному итогу.

Мы покупаем новый сервер, и нам бы очень хотелось узнать, какой большой диск нам понадобится, чтобы установить все эти ресурсы.

Я довольно новичок в сценарии Apple, но я пытаюсь.Я даже не могу найти элементы словаря AS, которые будут искать смонтированные диски - тем более не нужно делать математические операции по добавлению (даже если он просто выводит информацию, которую он извлекает, в файл с разделителями табуляции, который я могу вычислить в Excel)

На самом деле, может быть, это идеальная версия.Он видит крепление диска, получает имя, получает полную емкость, получает свободное место ... идеальный мир?дата создана.Затем добавляет это в текстовый файл.

Код, указатели, где учиться - все оценили.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Сценарий ниже предназначен для запуска в качестве действия папки .Если вы не знакомы с ними, они позволяют отслеживать назначенную папку на наличие изменений в ее содержимом, после чего может быть запущен AppleScript для выполнения некоторых действий с элементами, которые были добавлены (или удалены) из отслеживаемой папки.

Всякий раз, когда монтируется диск, точка монтирования добавляется как элемент диска в папку /Volumes.Таким образом, вы можете настроить действие папки для просмотра содержимого папки /Volumes и запускать AppleScript при каждом подключении нового тома.

Вот сценарий, предназначенный для запуска:

use sys : application "System Events"
use scripting additions

property text item delimiters : tab
property fp : "~/Desktop/diskinfo.csv"

on adding folder items to Volumes after receiving D
    set D to a reference to the sys's disk named (item 1 of D)

    set f to a reference to sys's file fp
    if not (f exists) then initCSVFile(fp)

    set isod to the (current date) as «class isot» as string

    get the contents of {isod's text 1 thru 10, ¬
        isod's text 12 thru -1, ¬
        D's name, ¬
        gigabytes(D's capacity), ¬
        gigabytes(D's free space)} as text

    write the result & linefeed ¬
        to (f as alias) ¬
        starting at eof ¬
        as «class utf8»
end adding folder items to

to gigabytes(bytes)
    round bytes / (10 ^ 7)
    result / 100
end gigabytes

to initCSVFile(fp)
    local fp

    set f to make of sys new file with properties {name:fp}

    {"Date", "Time", "Volume Name", "Capacity (GB)", "Free Space (GB)"}
    write (result as text) & linefeed to (f as alias) as «class utf8»
end initCSVFile

Скопируйте и вставьте это в Редактор сценариев и сохраните его как "New Volume Mounted.scpt" в папке ~/Library/Scripts/Folder Action Scripts, где ~ - ваш домашний каталог, например, /Users/Alex,Если папка "Folder Action Scripts" не существует, создайте ее.

Если вы счастливы, создав отсюда действие с папкой, сделайте это и подключите новый том.Когда приведенный выше сценарий запускается, он добавляет текущую дату и время монтирования тома вместе с его именем, емкостью и объемом свободного места в конец файла diskinfo.csv на рабочем столе (если файл не существует), скрипт создает его).Это файл CSV (значение, разделенное запятыми), в котором в качестве разделителей используются вкладки (так что на самом деле это TSV).QuickLook обычно может отображать содержимое этих файлов довольно приятно:

QuickLook


Настройка действий папки

Если вы незнакомы с настройкой действия с папкой, затем прочитайте раздел под названием Attaching a Folder Action Script to a Folder из Mac Automation Scripting Guide - Watching Folders.

Однако, чтобы сохранитьНекоторое время назад я также создал сценарий, который создаст для вас действие с папкой:

use sys : application "System Events"

property name : "Volumes"
property path : "/Volumes"
property folder action : a reference to folder action named (my name)
property script : "New Volume Mounted.scpt"
property folder : a reference to Folder Action scripts folder
property file : a reference to the file named (my script) in my folder

set folder actions enabled to true

if not (my file exists) then return open my folder
if my folder action exists then return my folder action's scripts

make new folder action with properties {name:my name, path:my path}
tell my folder action to make new script with properties ¬
    {name:my file's name, POSIX path:my file's POSIX path}

set my folder action's enabled to true
set my folder action's scripts's enabled to true

Снова скопируйте и вставьте его в новый документ в Редактор сценариев а затем запустить его.Делайте это только после того, как вы сохранили первый скрипт в указанном мною месте, и дважды проверьте имя файла "New Volume Mounted.scpt" (вы можете выбрать любое имя файла, которое вам нравится, но вам нужно будет внести соответствующие изменения в сценарий, который создаетдействие с вашей папкой).

Возможно, вам потребуется предоставить необходимые привилегии доступа для запуска этого скрипта.

Если у вас возникнут какие-либо проблемы, дайте мне знать.

0 голосов
/ 12 октября 2018

Вот решение AppleScript, которое возвращает отображаемое имя и объем свободного места, доступного на каждом подключенном томе.

set allMountedVolumesInfo to {}

tell application "System Events"
    set everyDisk to every disk
    repeat with i from 1 to count of everyDisk
        set thisDisk to displayed name of item i of everyDisk
        tell its disk thisDisk
            try
                set diskFreeSpace to (characters 1 thru 7 of ((free space / 1.0E+9) as string))
                set totalCapacity to (characters 1 thru 7 of ((capacity / 1.0E+9) as string))
                set creationDate to creation date
            on error errMsg number errNum
                set diskFreeSpace to (free space / 1.0E+9)
                set totalCapacity to (capacity / 1.0E+9)
                set creationDate to creation date
            end try
            set theRecord to {volume:thisDisk, free space:((diskFreeSpace & " Gigabytes") as string), creation date:creationDate, capacity:((totalCapacity & " Gigabytes") as string)}
        end tell
        set end of allMountedVolumesInfo to theRecord
    end repeat
end tell
...