У меня есть AppleScript, который используется для программного создания файла тестового сценария в одной из следующих папок приложения Office 2016:
~/Library/Application Scripts/com.microsoft.Excel
~/Library/Application Scripts/com.microsoft.Word
~/Library/Application Scripts/com.microsoft.Powerpoint
Это содержимое файла test.scpt, которое генерируется программным путем:
on handlerTest(thisPhrase)
say thisPhrase
end handlerTest
Этот файл test.scpt содержит один обработчик, который произносит переданную ему фразу.
Когда сценарий создается в одной из этих папок, я не вижу содержимое файла сценария.в Finder и вызов обработчика из приложения Microsoft Office с использованием нового VBA AppleScriptTask вызывает сбой приложения Office.Я думаю, что сценарий создается как файл, скомпилированный байтами, потому что он не может быть просмотрен в Finder как обычный текст.
Если я затем скопирую файл сценария, сгенерированный программно моим сценарием создателя сценария, в папку «Документы»,Содержимое сценария в виде обычного текста можно просмотреть в Finder.
Теперь, если я скопирую файл сценария из папки «Документы» обратно в соответствующую папку com.microsoft (не изменяя его), теперь я могу видеть простой-текстовое содержимое в Finder и вызов обработчика с помощью функции VBA AppleScriptTask работает должным образом.Я не понимаю, как видимо меняется формат из-за действий копирования / вставки?
Как программно создать файл сценария в папке com.microsoft.xyz в текстовом формате?
Вот моя процедура VBA:
Sub TestScript()
AppleScriptTask "test.scpt", "handlerTest", "hello world"
End Sub
Вот мой пример сценария создания сценария, который программно создает файл test.scpt в папке сценариев com.microsoft.Powerpoint: (слава eliteproxy для оригинального исходного скрипта )
property theFolders : {"~/Library/'Application Scripts'/com.microsoft.Powerpoint"}
try
tell application "Finder" to set targetFolder to (target of the front window) as alias
on error -- no window
set targetFolder to (choose folder)
end try
# build a parameter string from the folder list
set {tempTID, AppleScript's text item delimiters} to {AppleScript's text item delimiters, space}
set {theFolders, AppleScript's text item delimiters} to {theFolders as text, tempTID}
do shell script "cd " & quoted form of POSIX path of targetFolder & "; mkdir -p " & theFolders
--Write the Script file if it does not exist
if ExistsFile("~/Library/'Application Scripts'/com.microsoft.Powerpoint/test.scpt") is false then
tell application "Finder"
--GET THE WORKING DIRECTORY FOR FILE COPY OF SCRIPT
get folder of (path to me) as Unicode text
set workingDir to POSIX path of result
--Write the new script in the current working directory
set textFile to workingDir & "test.scpt"
--Delete script if it exists
set posixPath to POSIX path of textFile as string
do shell script "rm -rf \"" & posixPath & "\""
--Create Script Interface file for Microsoft PowerPoint VBA Applications
set fd to open for access textFile with write permission
-- Create test handler which speaks the passed phrase parameter
write "on handlerTest(thisPhrase)" & linefeed to fd as «class utf8» starting at eof
write "say thisPhrase" & linefeed to fd as «class utf8» starting at eof
write "end handlerTest" & linefeed to fd as «class utf8» starting at eof
close access fd
--Copy the script file into the MACOS-Specific 'safe' folder
set fromPath to quoted form of POSIX path of (workingDir) & "test.scpt"
set toPath to quoted form of "~/Library/'Application Scripts'/com.microsoft.Powerpoint"
do shell script "cp -R " & fromPath & space & "~/Library/'Application Scripts'/com.microsoft.Powerpoint" with administrator privileges
end tell
end if
--Delete the temp script file from the working directory
set posixPath to POSIX path of textFile as string
do shell script "rm -rf \"" & posixPath & "\""
--Provide confirmation
set theAlertTitle to "TEST"
set theAlertMsg to "The script has been successfully installed."
display alert theAlertTitle message theAlertMsg as informational buttons {"OK"} default button "OK" cancel button "OK"
--For use when checking if a file exists
on ExistsFile(filePath)
tell application "System Events" to return (exists disk item filePath) and class of disk item filePath = file
end ExistsFile