2013-07-12 52 views
10

Những gì tôi cố gắng làm:Làm thế nào để có được tên của ứng dụng frontmost với AppleScript và sử dụng nó để có được những filepath

Khi tôi đang ở trong một trong soạn thảo văn bản của tôi (TextEdit, tục ngư, FoldingText) Tôi muốn AppleScript này để hiển thị đường dẫn tệp.

Tôi đã tìm ứng dụng cửa sổ ở phía trước giúp tôi có được tên ứng dụng đẹp và dễ dàng và sau đó tôi có thể yêu cầu đường dẫn POSIX trong bước tiếp theo.

Vấn đề:

Các kịch bản đã được 99% đó, nhưng tôi đang thiếu một cái gì đó. Khi tôi cố gắng sử dụng các biến của activeApp nó không hoạt động và tôi nhận được lỗi này:

Error Number:System Events got an error: Can’t get application {"TextEdit"}. 
-1728 

Đây là kịch bản:

tell application "System Events" 
    set activeApp to name of application processes whose frontmost is true 

    --This doesn't work either: 
    --do shell script "php -r 'echo urldecode(\"" & activeApp & "\");'" 

    tell application activeApp 
     set myPath to POSIX path of (get file of front document) 
    end tell 
    display dialog myPath 
end tell 

Nếu tôi trao đổi với activeApp"TextEdit" mọi thứ hoạt động. Trợ giúp sẽ được đánh giá cao.

Có thể có một cái gì đó ở đây giúp: Get process name from application name and vice versa, using Applescript

Trả lời

7

Hoặc lấy path sở hữu của một tài liệu hoặc sử dụng hệ thống sự kiện để có được value of attribute "AXDocument":

try 
    tell application (path to frontmost application as text) 
     (path of document 1) as text 
    end tell 
on error 
    try 
     tell application "System Events" to tell (process 1 where frontmost is true) 
      value of attribute "AXDocument" of window 1 
     end tell 
     do shell script "x=" & quoted form of result & " 
     x=${x/#file:\\/\\/} 
     x=${x/#localhost} # 10.8 and earlier 
     printf ${x//%/\\\\x}" 
    end try 
end try 

Phương pháp đầu tiên đã không làm việc với Preview, TextMate 2, Text Sublime, hoặc ICHM, và phương pháp thứ hai đã không làm việc với Acorn. Phương pháp thứ hai yêu cầu quyền truy cập cho các thiết bị trợ giúp được bật.

+0

Phần thử chỉ là tuyệt vời. Rất linh hoạt và rất ít công việc tay của việc nhận tất cả các ứng dụng khác nhau để xuất ra đường dẫn chính xác (chỉ dừng viết các điều kiện IF ngay sau khi tôi thử nghiệm điều này). Apropos, "nếu" tôi có thể làm điều này để làm việc với nvALT thì tôi thậm chí còn nhiều hơn tôi mong muốn. – pattulus

+0

Bạn có thể sử dụng một cái gì đó như 'nói ứng dụng" Sự kiện hệ thống "để nói (quá trình 1 ở phía trước là đúng) nếu tên là" nvALT "thì ((thuộc tính hệ thống" HOME ") &"/Ghi chú/"& giá trị của trường văn bản 1 của nhóm 1 của thanh công cụ 1 của cửa sổ 1 & ".txt") '. – user495470

+1

Điều này thật tuyệt. Cảm ơn. Nhưng khi tôi chạy kịch bản, nó sẽ xóa văn bản ở đầu đường dẫn để '/ users/username/path/to/file' trở thành' sername/path/to/file'. Bất kỳ ý tưởng tại sao? – drstevok

1

Bạn đang yêu cầu ...

set activeApp to name of application processes whose frontmost is true 

Thông báo "quá trình", đó là ý nghĩa số nhiều bạn có thể nhận được một số quy trình để đáp ứng nên AppleScript cung cấp cho bạn một danh sách các tên. Mặc dù chỉ có một ứng dụng được trả về, nó vẫn ở định dạng danh sách. Cũng thấy rằng lỗi của bạn chứa {"TextEdit"}. Các dấu ngoặc xung quanh tên có nghĩa là đó là một danh sách, do đó, lỗi sẽ hiển thị cho bạn sự cố.

Bạn không thể chuyển danh sách tên tới dòng mã tiếp theo. Như vậy bạn có một vài lựa chọn. 1) bạn chỉ có thể yêu cầu 1 quy trình thay vì tất cả các quy trình. Điều đó sẽ trả về một chuỗi thay vì một danh sách. Hãy thử mã này ...

set activeApp to name of first application process whose frontmost is true 

2) bạn có thể làm việc với danh sách bằng cách sử dụng "mục 1 của danh sách". Hãy thử mã này ...

set activeApps to name of application processes whose frontmost is true 
set activeApp to item 1 of activeApps 

Cuối cùng, bạn không nên thông báo cho các sự kiện của hệ thống để báo cho ứng dụng. Tách riêng 2 lệnh đó cho biết các khối mã. Đây là cách tôi sẽ viết mã của bạn.

tell application "System Events" 
    set activeApp to name of first application process whose frontmost is true 
end tell 

try 
    tell application activeApp 
     set myPath to POSIX path of (get file of front document) 
    end tell 

    tell me 
     activate 
     display dialog myPath 
    end tell 
on error theError number errorNumber 
    tell me 
     activate 
     display dialog "There was an error: " & (errorNumber as text) & return & return & theError buttons {"OK"} default button 1 with icon stop 
    end tell 
end try 

Tôi không thể đảm bảo mã "nhận tệp tài liệu trước" sẽ hoạt động. Điều đó phụ thuộc vào ứng dụng. Không phải tất cả các ứng dụng đều hiểu yêu cầu đó. Đó là lý do tại sao tôi sử dụng một khối thử. Trong mọi trường hợp, dù bạn có thể chắc chắn bạn đang giải quyết các ứng dụng thích hợp. Chúc may mắn.

+0

Cảm ơn vì đã sửa cho tôi về số nhiều quy trình… Tôi đã không nghĩ về điều đó. Tôi vẫn đang học những điều cơ bản (ngày hôm qua tôi đã làm việc trên một danh sách AppleScript và nhận được các dấu ngoặc nhọn ở đây làm cho tôi tự hỏi). // Ngoài ra bây giờ tôi đã thực hiện hai phần tách ra như bạn đề nghị. Tôi vẫn không có may mắn. // Tôi đã sao chép tập lệnh của bạn và thử nó trên trình chỉnh sửa văn bản của tôi nhưng vẫn có sự cố -1728. – pattulus

+0

Tôi đã cập nhật mã ... Tôi quên "tên của quy trình đăng ký đầu tiên" vì vậy hãy thử lại. – regulus6633

+0

Tôi cập nhật mô tả của mình giải thích rõ hơn những gì tôi đang theo dõi. Thật đáng buồn khi cố gắng "tên của đầu tiên" chỉ ra một biến thể của lỗi: "lỗi" AppleScript Editor có lỗi: Không thể lấy tập tin của tài liệu 1. "số -1728 từ tập tin tài liệu 1" – pattulus

1

Tôi đã sử dụng đoạn mã này trong một thời gian, dường như làm việc cho tất cả các ứng dụng Cocoa (không chắc chắn về X11):

set front_app to (path to frontmost application as Unicode text) 

tell application front_app 
    -- Your code here 
end tell 
+0

Cảm ơn bạn đã đóng góp , nhưng điều này chỉ nhận được các ứng dụng, nhưng không phải là các tài liệu hoạt động/frontmost. – pattulus

0

Không ai trong số này dường như làm việc với một AppleScript biên soạn lưu lại dưới dạng một ứng dụng và đặt trên Dock. Bất cứ khi nào bạn chạy ứng dụng, CNTT là ứng dụng phía trước, không phải ứng dụng đang hiển thị cửa sổ trước của nó. Ứng dụng đó trở nên không hoạt động khi Applescript của tôi chạy. Làm thế nào để viết một ứng dụng Applescript không hoạt động khi nó chạy?

Tôi có thể đã tìm thấy giải pháp cho vấn đề được liệt kê ở trên. Chỉ cần yêu cầu người dùng kích hoạt lại ứng dụng mong muốn và cung cấp cho họ thời gian.

tell application "Finder" 
    activate 
    say "Click front window of your application" 
    delay 5 
    set myapp to get name of first application process whose frontmost is true 
-- etc. 
-- your code 
end tell