AppleScript 焦点/重命名文件(并单击任意位置)

发布于 2024-11-09 04:05:27 字数 995 浏览 0 评论 0原文

on run {input}
    set filepath to POSIX path of input
    do shell script "touch " & quoted form of filepath & "untitled"
    return input
end run

这是我到目前为止所拥有的,并且它有效,但是有没有办法然后专注于文件然后触发重命名?我不希望自动重命名,只需触发事件(例如在选择文件时按“返回”)。我不想使用任何类型的模式...

快速侧面问题:有没有办法设置它,以便我不必直接选择文件夹或文件,但可以通过以下方式来完成:比方说,只要文件夹位于 Finder 中,就单击该文件夹中的空白区域?现在,我已在 Finder.app 中将“服务接收选定”设置为“文件或文件夹”。

==更新的代码==

on run {input}
    set filepath to POSIX path of input
    do shell script "touch " & quoted form of filepath & "untitled"
    tell application "Finder"
        activate
        set target of Finder window 1 to POSIX file "/Users/oscargodson/Documents/designs/untitled"
    end tell
    tell application "System Events"
        tell process "Finder"
            keystroke return
        end tell
    end tell
    return input
end run

如果我硬编码它的工作路径!但是我如何才能将它作为一个有效的 var 呢?

on run {input}
    set filepath to POSIX path of input
    do shell script "touch " & quoted form of filepath & "untitled"
    return input
end run

Is what I have so far, and it works, but is there a way to then focus on the file then trigger a rename? I dont want the rename to be automatic, just trigger the event (like pressing "return" while you have a file selected). And I dont want to use any sort of modal...

Quick Side question: is there a way to set this so that i dont have to select a folder or file directly, but can do it by, lets say, clicking in a white space in a folder as long as it's in Finder? Right now I have my "Service receives selected" to "files or folders" in Finder.app.

== UPDATED CODE ==

on run {input}
    set filepath to POSIX path of input
    do shell script "touch " & quoted form of filepath & "untitled"
    tell application "Finder"
        activate
        set target of Finder window 1 to POSIX file "/Users/oscargodson/Documents/designs/untitled"
    end tell
    tell application "System Events"
        tell process "Finder"
            keystroke return
        end tell
    end tell
    return input
end run

If i hardcode the path it works! But how do I get it as a var that works?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

陪我终i 2024-11-16 04:05:27

这是一种方法。我认为询问名称的模态窗口会更好,但你可以尝试这个。请注意,您在此代码中没有使用“POSIX 路径”。 Applescript 不使用 POSIX 路径。另外,{input}(如括号所示)是一个项目列表。因此,您对列表中的项目进行操作,在本例中,我们对第一项进行操作。

set filepath to item 1 of input

tell application "Finder"
    activate
    reveal filepath
end tell

tell application "System Events"
    tell process "Finder"
        keystroke return
    end tell
end tell

编辑:使用更新后的代码,这是一个工作脚本...

on run {input}
    if (class of input) is not list then set input to {input}
    set theFolder to (item 1 of input) as text

    try
        alias theFolder
        tell application "Finder"
            if (class of item theFolder) is not folder then error "input is not a folder."
            activate
            set theFile to make new file at folder theFolder with properties {name:"untitled"}
            reveal theFile
        end tell

        delay 0.2

        tell application "System Events"
            tell process "Finder"
                keystroke return
            end tell
        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
            return
        end tell
    end try
    return input
end run

Here's one way. I think a modal window where you ask for the name would be better but you can try this. Notice you do not use "POSIX path" in this code. Applescript doesn't use POSIX paths. Also {input}, as indicated by the brackets around it, is a list of items. Therefore you act on the items of the list, and in this case we act on the first item.

set filepath to item 1 of input

tell application "Finder"
    activate
    reveal filepath
end tell

tell application "System Events"
    tell process "Finder"
        keystroke return
    end tell
end tell

EDIT: With your updated code, here's a working script...

on run {input}
    if (class of input) is not list then set input to {input}
    set theFolder to (item 1 of input) as text

    try
        alias theFolder
        tell application "Finder"
            if (class of item theFolder) is not folder then error "input is not a folder."
            activate
            set theFile to make new file at folder theFolder with properties {name:"untitled"}
            reveal theFile
        end tell

        delay 0.2

        tell application "System Events"
            tell process "Finder"
                keystroke return
            end tell
        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
            return
        end tell
    end try
    return input
end run
萌辣 2024-11-16 04:05:27
tell application "Finder"
    activate
    reopen -- in case there are no open windows
    set target of Finder window 1 to POSIX file "/Applications/Safari.app"
end tell

revealselect 始终打开一个新窗口,set targetset Selection 则不会。

我不知道为什么,但是当在列视图中使用设置选择时,您只能选择前窗口目标的全部内容中的项目。同样的事情在其他视图中不会发生,所以这看起来像是一个错误。


修复已编辑问题中的代码:(

on go(input)
    set p to POSIX path of (input as text)
    set p2 to p & "untitled"
    do shell script "touch " & p2
    tell application "Finder"
        reopen
        activate
        set target of Finder window 1 to POSIX file p2
    end tell
    delay 0.3 -- time to release modifier keys
    tell application "System Events" to keystroke return
end go

tell application "Finder"
    set fold to folder (path to documents folder)
end tell
go(fold)

on go 和最后几行仅用于测试。)

tell application "Finder"
    activate
    reopen -- in case there are no open windows
    set target of Finder window 1 to POSIX file "/Applications/Safari.app"
end tell

reveal and select always open a new window, set target and set selection don't.

I don't know why, but when set selection it used in column view, you can only select items in the entire contents of the target of the front window. The same thing doesn't happen in other views, so it seems like a bug.


Fix for the code in the edited question:

on go(input)
    set p to POSIX path of (input as text)
    set p2 to p & "untitled"
    do shell script "touch " & p2
    tell application "Finder"
        reopen
        activate
        set target of Finder window 1 to POSIX file p2
    end tell
    delay 0.3 -- time to release modifier keys
    tell application "System Events" to keystroke return
end go

tell application "Finder"
    set fold to folder (path to documents folder)
end tell
go(fold)

(That on go and the last lines are just for testing.)

百善笑为先 2024-11-16 04:05:27

我基于 @regulus6633 的 AppleScript 创建了一个 AppleScript,但进行了一些改进。

注意:此答案最初作为询问不同答案发布。为了方便起见,我在这里复制/粘贴。


我们的想法是创建一个 Automator 工作流程,并使用以下步骤为其分配快捷方式:

  • 打开 Automator 并创建一个服务
  • 将输入设置为无输入,并将应用程序设置为Finder.app
  • 运行AppleScript工作流程元素拖放到灰色空间;
  • 将此 AppleScript 的内容放入文本框中;
  • 使用合理的名称保存工作流程(例如新建文件);
  • 转到设置 ->键盘->快捷方式->服务并为其分配快捷方式。

现在,让我们展示 AppleScript:

set file_name to "untitled"
set file_ext to ".txt"
set is_desktop to false

-- get folder path and if we are in desktop (no folder opened)
try
    tell application "Finder"
        set this_folder to (folder of the front Finder window) as alias
    end tell
on error
    -- no open folder windows
    set this_folder to path to desktop folder as alias
    set is_desktop to true
end try

-- get the new file name (do not override an already existing file)
tell application "System Events"
    set file_list to get the name of every disk item of this_folder
end tell
set new_file to file_name & file_ext
set x to 1
repeat
    if new_file is in file_list then
        set new_file to file_name & " " & x & file_ext
        set x to x + 1
    else
        exit repeat
    end if
end repeat

-- create and select the new file
tell application "Finder"

    activate
    set the_file to make new file at folder this_folder with properties {name:new_file}
    if is_desktop is false then
        reveal the_file
    else
        select window of desktop
        set selection to the_file
        delay 0.1
    end if
end tell

-- press enter (rename)
tell application "System Events"
    tell process "Finder"
        keystroke return
    end tell
end tell

为了方便起见,我将此 AppleScript 放在 此 GitHub Gist 中。

I've created an AppleScript based on the @regulus6633's one, but with some improvements.

Note: This answer was originally posted as an AskDifferent answer. I'm copy/pasting here for convenience.


The idea is to create an Automator workflow and assigning a shortcut to it using the following steps:

  • Open Automator and create a Service;
  • Set the input to no input, and the application to Finder.app;
  • Drag and Drop the Run AppleScript workflow element onto the grey space;
  • Put the contents of this AppleScript in the textbox;
  • Save the workflow with a reasonable name (like New File);
  • Go to Settings -> Keyboard -> Shortcuts -> Services and assign a shortcut to it.

Now, let's show the AppleScript:

set file_name to "untitled"
set file_ext to ".txt"
set is_desktop to false

-- get folder path and if we are in desktop (no folder opened)
try
    tell application "Finder"
        set this_folder to (folder of the front Finder window) as alias
    end tell
on error
    -- no open folder windows
    set this_folder to path to desktop folder as alias
    set is_desktop to true
end try

-- get the new file name (do not override an already existing file)
tell application "System Events"
    set file_list to get the name of every disk item of this_folder
end tell
set new_file to file_name & file_ext
set x to 1
repeat
    if new_file is in file_list then
        set new_file to file_name & " " & x & file_ext
        set x to x + 1
    else
        exit repeat
    end if
end repeat

-- create and select the new file
tell application "Finder"

    activate
    set the_file to make new file at folder this_folder with properties {name:new_file}
    if is_desktop is false then
        reveal the_file
    else
        select window of desktop
        set selection to the_file
        delay 0.1
    end if
end tell

-- press enter (rename)
tell application "System Events"
    tell process "Finder"
        keystroke return
    end tell
end tell

For convenience, I'm putting this AppleScript in this GitHub Gist.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文