Как создать новый файл в Finder и открыть его?

По какой-то причине Finder на Mac не имеет функции создания новых файлов. Самый быстрый способ создать новый файл, который я нашел, - это перетащить путь поиска в Терминал и создать там файл ... что очень раздражает.

Я написал сценарий Apple для автоматического создания нового файла и привязки его к ярлыку. Он работает отлично, за исключением того, что я не могу понять, как открыть новый файл из AppleScript. Я почти уверен, что ошибка связана с путями POSIX/UNIX, но не смог найти способ заставить это работать, даже когда я помещал POSIX рядом с файлом, currentDir и т. д.

Вот мой сценарий:

set file_name to display dialog "File Name" default answer "untitled" with icon note buttons {"Cancel", "Continue"} default button "Continue"
set file_name to (text returned of file_name)

tell application "Finder"
    set theWin to window 1
    set currentDir to POSIX path of (target of theWin as alias)
    
    make new file at (the target of the front window) as alias with properties {name:file_name}
    set currentPath to (currentDir & file_name) as string
    open file currentPath
end tell

Сценарий создает файл, а затем выдает ошибку, говоря, что не может найти файл, чтобы открыть его.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
103
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы планируете выполнять операции с файлами с помощью Finder, лучше избегать использования путей posix. В вашем коде есть пара дубликатов, поэтому я немного упростил его.

set file_name to display dialog "File Name" default answer "untitled" with icon note buttons {"Cancel", "Continue"} default button "Continue"
set file_name to (text returned of file_name)

tell application "Finder"
    set theWin to window 1
    set currentDir to (target of theWin as text)
    --> "MacHD:Users:username:Hours of Operation:"

    make new file at theWin with properties {name:file_name}
    set currentPath to currentDir & file_name
    --> "MacHD:Users:username:Hours of Operation:untitled.txt"
    open file currentPath
end tell

Попробуйте поместить это после приведенного выше (и закомментировать строку open file… выше).

tell application "System Events"
    activate application "TextEdit"
    open file currentPath of application "TextEdit" 
end tell
currentPath

Кроме того, попробовав описанное выше, поместите имя переменной currentPath в последнюю строку скрипта (как я добавил выше) и запустите из редактора скриптов. Его значение должно появиться в «Результате». Вы можете заменить компоненты диска/имени пользователя, но я хочу увидеть точную компоновку строки.

Несколько вещей, которые следует учитывать:

Некоторые файлы нельзя открыть таким образом, например, jpeg. Предварительный просмотр не позволит открыть пустое изображение, по-видимому, потому, что изображения создаются не так. Сложные форматы файлов (например, страницы) также не будут работать. Но с обычным текстовым файлом проблем быть не должно. Таким образом, я бы подумал о добавлении «.txt» к вашему имени файла по умолчанию.

Спасибо Мокман. Это на один шаг ближе, но вместо этого я получаю ошибку разрешения. Скрипт уже имеет привилегии root, и я могу открыть файл - он просто не открывается из applescript.

Alec 19.10.2022 22:20

Какая версия ОС?

Mockman 20.10.2022 00:20

Я использую монтери (12.6)

Alec 20.10.2022 00:34

У Монтерея есть некоторые проблемы с безопасностью, влияющие на некоторые действия. Вы запускаете скрипт из редактора скриптов или как приложение? Возможно, вам потребуется предоставить разрешения на доступ (в разделе «Безопасность и конфиденциальность» в Системных настройках). Я использую гораздо более старую ОС (Sierra), поэтому я не в курсе.

Mockman 20.10.2022 04:04
Ответ принят как подходящий

Я немного подчистил код и избавился от ненужных строк.

set fileName to text returned of (display dialog "File Name" default answer ¬
    "untitled" with icon note buttons {"Cancel", "Continue"} default button 2)

tell application "Finder" to set newFile to (make new file at Finder window 1 ¬
    with properties {name:fileName}) as alias

delay 0.1
do shell script "open -e " & quoted form of POSIX path of newFile

Примечание. Если вы пытаетесь использовать open -a вместо open -e... И вы получаете сообщения об ошибках, попробуйте использовать open -b. Этот параметр позволяет открывать файлы вместе с приложением, используя идентификатор пакета приложения для идентификации используемого приложения.

Например, если я хочу открыть файлы с помощью Visual Studio Code.app, используя его идентификатор пакета... Команда do shell script будет выглядеть так...

do shell script "open -b com.microsoft.VSCode " & quoted form of POSIX path of newFile

Если вы не знаете, как получить идентификатор пакета для приложения, которое будет использоваться при открытии файла, следующий код AppleScript позволит вам выбрать приложение, а затем скопировать его идентификатор пакета в буфер обмена. Затем просто вернитесь и вставьте это в команду do shell script "open -b ".

activate
set chosenApp to name of (choose application with title ¬
    "Choose App" with prompt "Choose App")
delay 0.1

tell application chosenApp to set appID to id

set the clipboard to appID

Обязательно предоставьте Terminal.app соответствующие разрешения в Системных настройках.

Спасибо за ваш ответ. Я получаю ту же ошибку разрешений, что и другой вопрос. Пробовал настроить специальные возможности для FastScript (как я запускаю рабочий процесс), но это ничего не дало. Файлы без расширений файлов в любом случае такие же, как текстовые файлы на Mac, поэтому это не проблема, если они открываются в редакторе сценариев, потому что я могу изменить приложение по умолчанию. Я хочу иметь возможность создавать файлы оболочки, файлы python и т.д.

Alec 21.10.2022 02:48

@Alec Я обновил код в своем посте и протестировал файлы, созданные без расширения файла и с расширениями файлов «.txt», «.sh», «.py» и «.scpt». Команда open -e гарантирует, что файлы будут открываться с помощью TextEdit.app. Команда man open в Терминале показывает различные параметры, которые вы можете использовать с командой open.

wch1zpink 21.10.2022 16:17

идеально. Знаете ли вы, почему добавление & "-a Visual\ Studio\ Code.app" в конец и удаление -e не удается?

Alec 22.10.2022 05:42

@Alec Алек, я добавил в свой пост дополнительную информацию, которая может быть хорошим решением проблемы с ошибкой, которую вы получаете при использовании команды open -a.

wch1zpink 22.10.2022 15:20

Спасибо за вашу помощь. Знаете ли вы, что такое идентификатор пакета VSCode?

Alec 25.10.2022 22:00

@Alec Я добавил код в свой пост, чтобы вы могли получить идентификатор пакета. Это com.microsoft.VSCode. Я установил Visual Studio Code.app для тестирования и отредактировал команду do shell script на эту do shell script "open -b com.microsoft.VSCode " & quoted form of POSIX path of newFile. Он работает в моей системе, и файлы открываются с помощью Visual Studio Code.app.

wch1zpink 25.10.2022 22:34

Почему вы столкнулись с проблемой использования Finder для создания файла, а затем вызвали оболочку, чтобы открыть файл? Но затем вы описываете использование двух разных соглашений об именах как плохую практику. Где именно вы рисуете свои линии и почему ни одна из ваших линий не соединяется?

CJK 26.10.2022 00:13

@CJK Grasshoppa LOL. Единственная причина, по которой я использовал Finder, заключается в том, что исходный код OP специально предназначен для создания нового файла в Finder window 1, и поскольку мы уже нацелились на Finder... Можно также продолжить с Finder, создающим фактический файл. Следующая проблема заключалась в том, что если созданный файл не имел расширения имени, то команда для открытия этого файла выдает ошибку, потому что Finder не знает, что с ним делать. Поскольку новые расширения файлов могут быть ничем, или .scpt, или .py и т. д. Я с самого начала подумал, что команда do shell script open идеальна.

wch1zpink 26.10.2022 00:40

С Finder я хорошо разбираюсь. Это твой обстрел показался внетрассовым, но я вижу твою логику. Пара сотен раз или около того, которые я советовал использовать системные события для операций с файлами, не были потрачены впустую. Вам нужно использовать Finder для доступа к переднему окну Finder, то есть tell application "Finder" to set dir to the target of Finder window 1 as text. Но тогда можно tell application "System Events" to tell (make new file at folder dir with properties {name:fileName}) to set [A, fileRef] to [the default application's path, it as alias]. Наконец, tell application A to open the fileRef 😮

CJK 26.10.2022 01:13

Ваше использование составных команд весьма впечатляет. Однако проблема в том, что он хочет, чтобы каждый тип файла, будь то расширение имени .scpt, .txt, .py, без расширения и т. д., открывался одним и тем же приложением (Visual Studio Code.app). Ваше решение использует приложение по умолчанию для каждого конкретного расширения имени, чтобы открыть файл. Я открыт для лучших решений, но на данный момент я все еще думаю, что мое решение справляется с задачей довольно легко. Нет?

wch1zpink 26.10.2022 03:08

Другие вопросы по теме