AppleScript アップルスクリプト 質問、発表 8
0001名称未設定
垢版 |
2023/03/25(土) 06:38:03.65ID:4gHvNmU30
質問、発表どっちでもスレ。

■注意
安直なスクリプト作成依頼、丸投げ、「こういうの作ってください!」はお断り。
わからない点、エラーが解決できない点についてはスクリプト片を添えて質問すること。
OSバージョンも忘れずに。

■参考
AppleScript Language Guide
https://developer.apple.com/library/mac/documentation/AppleScript/Conceptual/AppleScriptLangGuide/
TN2065: do shell script
https://developer.apple.com/library/mac/technotes/tn2065/
AppleScript: The Language of Automation
http://www.macosxautomation.com/applescript/
MacWiki - AppleScript
http://macwiki.osdn.jp/wiki/index.php/AppleScript
鳶嶋工房 / AppleScript
http://tonbi.jp/AppleScript/
AS Hole(AppleScriptの穴)
http://piyocast.com/as/

■過去スレ
https://egg.5ch.net/test/read.cgi/mac/1491018171/
https://potato.5ch.net/test/read.cgi/mac/1387630245/
https://anago.5ch.net/test/read.cgi/mac/1330350325/
https://anago.5ch.net/test/read.cgi/mac/1256127156/
https://pc11.5ch.net/test/read.cgi/mac/1223026902/
https://pc11.5ch.net/test/read.cgi/mac/1197443062/
https://pc11.5ch.net/test/read.cgi/mac/1174045850/
0107名称未設定
垢版 |
2023/07/27(木) 17:09:09.76ID:eQcQ7Kl+0
Venturaで
システム設定.app>一般>ストレージ>すべてのボリューム
を開くスクリプトって可能でしょうか
0110名称未設定
垢版 |
2023/07/27(木) 17:54:15.26ID:um6pLo6D0
>>107
tell application "System Events" to get every disk
0111名称未設定
垢版 |
2023/07/27(木) 18:42:45.19ID:eQcQ7Kl+0
ありがとうございます
>>108さんのアドバイスで解決しました
頑張る、なんてコマンド、リファレンスのどこにも書かれていない...(´・ω・`)

on run {input, parameters}
tell application "System Settings"
activate
reveal pane id "com.apple.systempreferences.GeneralSettings" -- works as expected
delay 1
tell application "System Events"
tell process "System Settings"
click button 3 of group 1 of scroll area 1 of group 1 of group 2 of splitter group 1 of group 1 of window "一般"
delay 4 --接続している外部機器がスリープしている場合、すべてのストレージ機器がウェィ苦するまでに要する時間にする
click button 1 of group 1 of scroll area 1 of group 1 of group 1 of group 2 of splitter group 1 of group 1 of window "ストレージ"
end tell
end tell
end tell
end run

ショートカット化して「cmd-F19」で起動可能にして便利になたよ(`・ω・´)
0112sage
垢版 |
2023/09/09(土) 09:06:08.82ID:chRMarHQ0
JavaScript(JXA)をAutomatorで効率的に実行する方法についての
質問です。現在は同じ内容のJavaScript(JXA)を
「ライブラリー==>JavaScriptを実行」で複数回
次のようにAutomatorに書き込んでいます。

function run(input, parameters) {
 [50行の同一のJXA]
return input;
}

この[50行の同一のJXA]を外部ファイルに書き出して,それをAutomator
から実行する(呼び出す)方法はございますか? 
なお「同じ内容のJavaScript(JXA)」の前後には,Automatorで
JXA以外のコマンドを実行しております。
0114sage
垢版 |
2023/09/09(土) 14:35:16.01ID:chRMarHQ0
ご教示ありがとうございます。(1)フォルダーを作成し:
mkdir ~/Library/Script Libraries/
(2)そこにQuickTimeを制御するplayQt.scpt起き
function playMov() {
quickTimePlayer = Application("QuickTime Player");
quickTimePlayer.activate();
途中省略
}

(3)Automatorの方には次のようなJXAを書き込み
function run(input, parameters) {
toolbox = Library('playQt');
toolbox.playMov();
return input;
}

Automatorを実行すると,「Automatorが予期しない理由で終了しました」となりエラーが発生しました。
試しに(2)のスクリプトを次のように実質空にしても
function playMov() {
;
}
同じエラーメッセージが発生するので,(3)に問題があるようです。
0115名称未設定
垢版 |
2023/09/09(土) 16:35:45.33ID:GVt2qfmi0
(3)の中の2行は、Automatorでなしに、スクリプトエディタ上では動くの?
toolbox = Library('playQt');
toolbox.playMov();
0116sage
垢版 |
2023/09/09(土) 20:01:13.47ID:chRMarHQ0
>>115
>スクリプトエディタ上では動くの?
スクリプトエディタ上で(3)を実行すると
「スクリプトエディタが予期しない理由で終了しました。」と
エラーメッセージが表示され,クラッシュします。
2行目のtoolbox.playMov();を削除して
toolbox = Library('playQt');だけを実行すると
クラッシュはせず,エラーメッセージも表示されませんが
(予想通り)何も起こりません。
0117sage
垢版 |
2023/09/09(土) 20:40:36.00ID:chRMarHQ0
>>113
ここに紹介されているtoolbox.scptをコピペして
スクリプトエディタから,同じく紹介されている:
toolbox = Library('toolbox')
toolbox.log('Hello world')
を実行しても,「スクリプトエディタが予期しない理由で終了しました。」
と表示されて,クラッシュします。
 どこかで致命的なミス・思い違いをしているかもしれません。
0118名称未設定
垢版 |
2023/09/10(日) 07:43:40.20ID:63TOklfs0
JXAの実行環境がぶっ壊れてるのかも

作りかけのJXAスクリプトであっけなくクラッシュしてしまうことは時々あるけど、今回のスクリプトは間違ってるわけでなし、うちでは動く
0119118
垢版 |
2023/09/10(日) 08:17:24.02ID:iEK5/xd+0
ご報告
別OSで試してみたらクラッシュしたw

どちらも古いけど
High Sierraでは動く
Catalinaではクラッシュ
0122117,116
垢版 |
2023/09/10(日) 13:20:58.13ID:zhde7ZtV0
>>120
ありがとうございます。家に帰り次第,試してみます!
0123sage
垢版 |
2023/09/10(日) 19:20:04.66ID:gle52nXw0
>>122
「実効専用」の「scptd (Script Bundle)で保存」して
見事,動きました!!! Ventura13.4.1では
「実効専用」のチェックボックスを
チェクしないと,動かないようです。
0124123
垢版 |
2023/09/14(木) 09:34:29.15ID:LjTlinaE0
(2)のJXAで,動画ファイル/Users/taro/13.mp4を開こうとすると,
 (1)「書類“13.mp4”を開けませんでした。
   このファイルはQuickTime Playerと互換性がありません。」
というエラーが表示されます。
 (2) quickTimePlayer = Application("QuickTime Player");
   quickTimePlayer.activate();
   result1 = quickTimePlayer.open("/Users/taro/13.mp4");
しかし(2)を実行する直前に:
 (3) この動画ファイル13.mp4をQuickTime Player.appで開き
   次にQuickTime Player.appを終了(Quit)する
作業を行い,その後に(2)を実行すると,(1)のエラーは表示されずに
正常に動画13.mp4が再生されます。
 ご教示いただきたいのは,(3)の作業を行わずに,直接(2)の
ようなJXAだけで正常に動画13.mp4を再生する方法です。
よろしくお願いします。
0126名称未設定
垢版 |
2023/09/14(木) 10:42:09.43ID:eXesN4Bq0
>>124
>quickTimePlayer.open("/Users/taro/13.mp4");
quickTimePlayer.open(Path("/Users/taro/13.mp4"));
JXAでファイルパスは単なる文字列表現で済ますのではなく、Pathで明示した方がいいだろう
0128123
垢版 |
2023/09/14(木) 10:56:24.98ID:LjTlinaE0
無事解決できました。いつもありがとうございます!
0129名称未設定
垢版 |
2023/09/23(土) 00:20:22.81ID:IY+9UYOO0
変数が 0 なら 1 を代入するスマートな方法ある?
0130名称未設定
垢版 |
2023/09/23(土) 01:55:15.11ID:lC4/k50A0
try
A * 1
on error
set A to 1
end try

---

item ((A / A) + 1) of {1, A}
set A to result
0131名称未設定
垢版 |
2023/09/23(土) 04:11:04.50ID:sFUrl3EY0
結局ベタが一番な気が
if x is 0 then set x to 1
x = x === 0 ? 1 : x;
0132名称未設定
垢版 |
2023/09/30(土) 20:46:51.36ID:7T7n9Pw50
Dockから特定のアプリを削除
Dockに特定のアプリを登録
これわかんねー
0133名称未設定
垢版 |
2023/10/08(日) 02:59:22.19ID:bQMpxACO0
DockもAppleScript対応して欲しいもんだ
0134名称未設定
垢版 |
2023/10/15(日) 19:43:16.88ID:YNkZQK1R0
SonomaでNight-shiftをapplescriptで実行する方法ご存知ありませんか?
https://github.com/ravicious/toggle-night-shift
これは試してみましたがダメでした。

本当は「カラーを反転」の状態でNight-Shiftをやりたいのですが
デフォルトではNight-Shiftで自動的にカラー反転が戻ってしまいます。
そこでカラープロファイルを2つ用意してトグルするともう一度反転が起こって
Night-Shiftとカラー反転を両立できるところまで分かっているのですが、
それをスクリプトで実行したくて質問したものです。
0135名称未設定
垢版 |
2023/10/16(月) 02:49:48.86ID:+ATjpBY00
GUI scriptingでコントロールセンターを操作するとか
0137名称未設定
垢版 |
2023/10/19(木) 13:33:15.36ID:lQy+IAGn0
ご返事ありがとうございます。
Python は無知ですのでハードルが高そうですけど試してみます。
0138名称未設定
垢版 |
2023/10/20(金) 03:43:56.56ID:/Qbn3qeO0
そこのグレースケールを操作するところの話、JXAで

var bundle = $.CFBundleCreate($.kCFAllocatorDefault, $.NSURL.fileURLWithPath('/System/Library/PrivateFrameworks/UniversalAccess.framework'));
var UAGrayscaleSetEnabled = $.CFBundleGetFunctionPointerForName(bundle, $('UAGrayscaleSetEnabled'));
ObjC.bindFunction('UAGrayscaleSetEnabled', ['void', ['bool']]);

$.UAGrayscaleSetEnabled(true);
0139名称未設定
垢版 |
2023/10/22(日) 11:04:42.65ID:ujAeEBxd0
Night Shiftの設定、JXAで
ObjC.import('CoreBrightness') が使えなかったんでこんな風にしてみた
合ってんだか合ってないんだか

ObjC.import('objc');
$.NSBundle.bundleWithPath('/System/Library/PrivateFrameworks/CoreBrightness.framework').load;
$.CBBlueLightClient = $.objc_getClass('CBBlueLightClient');

var client = $.CBBlueLightClient.alloc.init;
client.setEnabled(true);
0140名称未設定
垢版 |
2023/10/25(水) 23:18:00.58ID:x0BI0MYx0
システム環境設定を開かずに優先する言語を逆順に入れ替えるJXA一行
$.NSLocale.setPreferredLanguages($.NSLocale.preferredLanguages.reverseObjectEnumerator.allObjects)

普段は英語を優先してて日本語にすることもあるものの、毎度システム環境設定を開いて入れ替えるのが面倒になった
なお10.13 High Sierraではメニューバーの時計の表示は(システム環境設定を開いて変更したときのように)連動して変わってくれないのが難点
0141123
垢版 |
2023/10/27(金) 10:02:02.02ID:YFWw4ZOQ0
>>134
>SonomaでNight-shift
画面の明るさの話題が出たので関連質問です。
スクリプトエディター.appの真っ白な背景色を
変更する方法などはございますでしょうか? 
システム設定>アクセシビリティ>カラーを反転
だと,スクリプトエディターはダークになりますが
他のダークモード対応のアプリ・画面が白く輝き
目が疲れてしまいます。
0142名称未設定
垢版 |
2023/10/27(金) 10:46:31.09ID:gy+qqABI0
Script Debugger 8 試したら
8でDark Mode対応
試用期限20日後は"lite"モードになって使える
0143名称未設定
垢版 |
2023/10/27(金) 10:50:12.16ID:gy+qqABI0
> 試用期限20日後は"lite"モードになって使える

Dark Mode対応がどうなるかは不明
0145名称未設定
垢版 |
2023/11/03(金) 23:21:28.92ID:J/5IhoXs0
ターミナルで
printf 'あ' | pbcopy -pboard find
ってやると検索文字に入るのにdo shell scriptだと入らないのなんなん
0146名称未設定
垢版 |
2023/11/03(金) 23:32:29.70ID:J/5IhoXs0
自決
これで逝けました
do shell script "export LANG='ja_JP.UTF-8'; printf 'あ' | pbcopy -pboard find"
0147名称未設定
垢版 |
2023/11/11(土) 16:52:53.29ID:FmhRWB130
JXAで、ObjC.import('signal')すると、定数宣言されてるsys_signame(やsys_siglist)が見えそうなんだけど、$.sys_signameでクラッシュしてしまって(Segmentation fault: 11)何もできない
どうにか中の文字列を読めないか悩んでたのがとりあえず解決したので記録(元々これ使って何がしたかったって訳でもなく、import関係なくなっちゃったけど)

結論としては、dlsym()の戻り値を本来の'void*'から'void**'に変えてみるとポインタが指す先の文字列を読めた('void*'のままだとポインタそのものは見えるけど、その先はどうにもできなかった)

なお、このimportで参照されるのは/System/Library/PrivateFrameworks/JavaScriptAppleEvents.framework配下、BridgeSupportCache下signal.plistで、sys_signame(やsys_siglist)のtypeは[32*]
元となるsignal.hでの宣言は
extern __const char *__const sys_signame[NSIG]; 等、内容は https://opensource.apple.com/source/Libc/Libc-1244.50.9/gen/FreeBSD/siglist.c.auto.html のように
const char *const sys_signame[NSIG] = {
"Signal 0",
"hup", /* SIGHUP */
"int", /* SIGINT */ 等、これは/usr/lib/system/libsystem_c.dylib内にある
0148名称未設定
垢版 |
2023/11/11(土) 16:53:27.38ID:FmhRWB130
続き

読み出し例:
ObjC.bindFunction('dlopen', ['void*', ['char*', 'int']])
ObjC.bindFunction('dlsym', ['void**' /* 本来は 'void*' */, ['void*', 'char*']])
libref = $.dlopen('/usr/lib/libc.dylib', 2 /* RTLD_NOW */)
ptrref = $.dlsym(libref, 'sys_signame' /* または 'sys_siglist' */)
strs = []
for (i = 0; i < 32; i++) {
str = ''
for (j = 0; ; j++) {
if (ptrref[i][j] == 0) {
strs.push(str)
break
}
str += String.fromCharCode(ptrref[i][j])
}
}
strs.forEach((str, i) => console.log(i, str))

結果:
/* 0 Signal 0 */
/* 1 hup */
/* 2 int */ 等

他にも似たようなのあるけど、import用の.plistって、.hから機械的に変換、生成してるだけで、簡単に使えないのも混ざってるぽい
0149名称未設定
垢版 |
2023/11/13(月) 22:12:12.75ID:aSkuUmIr0
今更ながら前スレ https://egg.5ch.net/test/read.cgi/mac/1491018171/669 のJXA版

ObjC.import('AppKit')
ObjC.import('IOKit') // NX_KEYTYPE_SOUND_UP, etc.
ObjC.import('objc')
var fkey = $.NX_KEYTYPE_SOUND_UP
function fkeydown(fkey, down = true) {
var nil = $()
var flags = down ? 0xa00 : 0xb00
var event = $.NSEvent.otherEventWithTypeLocationModifierFlagsTimestampWindowNumberContextSubtypeData1Data2($.NSSystemDefined, $.NSZeroPoint, flags, 0, 0, nil, 8, ((fkey << 16) | flags), -1)
// $.CGEventPost($.kCGHIDEventTap, event.CGEvent)では動かない。無視される(システムログにエラー'Invalid event'が出る)か、クラッシュする
$.CGEventPost($.kCGHIDEventTap, event.performSelector($.sel_registerName('CGEvent')))
}
fkeydown(fkey)
fkeydown(fkey, false) // fkeyup

時々思い出しては解決できずにもやもやしてたけど、これでどうにか気が晴れた
0150名称未設定
垢版 |
2023/12/14(木) 13:14:31.45ID:zezJY19P0
MBPが壊れて買い換えて大幅に環境が変わったらAppletが動かなくなってた。色々影響あるのかな? すいません独り言の愚痴でした
0151名称未設定
垢版 |
2023/12/15(金) 08:32:16.45ID:PTesWRWe0
再保存、Script Editorで開いて保存しなければ動かないってあったな
0152名称未設定
垢版 |
2024/03/03(日) 04:30:45.67ID:Xj5rIMR50
iTermで現在のフォルダ名を記述するスクリプトを作りたいのですが
https://daeudaeu.com/finder-terminal/
を参考に下記を実行してみましたが
動作してくれません。
どなたか解決方法ご存知ありませんか?
iTermがデフォルトのTerminalでなくても実行できるようにしたいのですが。

on run {input, parameters}

tell application "Finder"
set hfsCurrentFolder to insertion location as Unicode text
set currentFolder to get POSIX path of hfsCurrentFolder
end tell

set command to "cd " & currentFolder

tell application "iTerm"
do script command
activate
end tell

end run
0154名称未設定
垢版 |
2024/03/03(日) 10:23:56.17ID:ms+RoSBt0
見たところcreate tabかcreate windowにcommand "command"あるけど、それを実行してもsession終わって閉じちゃうようだし、write text "text"の方かな
create window with default profile
tell current session of current window
write text "cd ~/Desktop"
end tell
とか
0155名称未設定
垢版 |
2024/03/03(日) 12:19:33.20ID:Xj5rIMR50
ご教示ありがとうございます。
下記を試してみましたが上手く行きませんでした。
mycommandをテキスト化できていないと思うのですが。
----------------------------------------

on run {input, parameters}

tell application "Finder"
set hfsCurrentFolder to insertion location as Unicode text
set currentFolder to get POSIX path of hfsCurrentFolder
end tell

set mycmd to "cd " & currentFolder

tell application "iTerm"
create window with default profile
tell current session of current window
write text mycmd
end tell

end run
0156名称未設定
垢版 |
2024/03/03(日) 12:34:44.59ID:ms+RoSBt0
tell と end が対になってないじゃん
それに、動作してくれません、上手くいきませんじゃなくて、エラーメッセージちゃんと書かないと
それと、いきなり組み込むんじゃなくて、あの程度なら、外から渡す変数もないようだし、スクリプトエディタで確認した方がいい

すまん、文句しか出ないw
0157名称未設定
垢版 |
2024/03/03(日) 12:50:00.54ID:Xj5rIMR50
ありがとうございます!
end tell を追記したら上手く行きました。
レスを投稿する


ニューススポーツなんでも実況