Automator - 处理将从 Applescript 传递到 Shell Script 的路径上的空格
Automator - dealing with spaces on paths that will be passed from Applescript to Shell Script
我有一个别名形式的 AppleScript 处理路径并将它们转换为 posix。
这些路径将由 shell 脚本在此自动化工作流程的第二步中处理。
问题是路径包含 spaces.
我不知道如何处理这个,所以我有这个子程序来删除任何 space 并将其替换为 \
。
on replaceChars(this_text, search_string, replacement_string)
set saveTID to AppleScript's text item delimiters
set AppleScript's text item delimiters to the search_string
set the item_list to every text item of this_text
set AppleScript's text item delimiters to the replacement_string
set this_text to the item_list as string
set AppleScript's text item delimiters to saveTID
return this_text
end replaceChars
Applescript 部分是我做的
-- convert the path from the alias form to posix
set fileInputPosix to (the POSIX path of thePath)
-- replace " " with "\ "
set quotedForm to replaceChars(fileInputPosix, space, "\ ")
此时路径似乎没问题,比如
'/Users/myUser/Desktop/my\ video\ file.png'
但是当我将此路径传递给 shell 脚本时,它不会接受。
只需引用shell行中的路径并删除搜索和替换部分
/usr/local/bin/ffmpeg -I "" -vf "select=eq(n\,)" -vframes 1 ""
您可以引用整个字符串或使用 quoted form of
智能地引用字符串,您也可以尝试转义单个字符,但在这种情况下,您需要转义每个转义字符,例如:
quoted form of “/Users/myUser/Desktop/my video file.png”
“/Users/myUser/Desktop/my\ video\ file.png”
在与您的其他 非常相似的情况下,您似乎正在创建一个不需要解决的问题,方法是选择使用 AppleScript 操作来接收最终被传递到的文件路径shell 脚本操作。这样做的唯一原因似乎是让 AppleScript“处理”文件路径作为 alias
文件引用,将它们转换为 posix 路径以便将它们用作 command-line 参数在 shell 脚本中。
这完全没有必要。即使您出于其他原因决定需要 AppleScript,Automator 在操作之间传递不兼容的数据类型时,通常会将它们转换为适当的格式†,因此 AppleScript alias
引用可以愉快地发送到 shell 脚本操作,它将自动接收它们作为 posix 文件路径:
在上面的屏幕截图中,您可以看到我在任何阶段都没有执行任何处理或操作,并且这两个脚本操作 return 语言的正确文件路径。
结论
▸ 删除您的 AppleScript 操作,只需将文件直接发送到 shell 脚本,as arguments
,然后附上您的 command-line 引号中的参数变量 @vadian 已经证明。
▸ 如果您出于其他原因使用 AppleScript,那很好。只需保留 alias
引用原样,然后将它们发送到 shell 脚本,并按照刚才描述的方式处理它们。
†从另一个方向发送的文件路径——从 shell 脚本到 AppleScript——不会,然而,神奇地变成 alias
参考资料。 posix 路径只不过是一段文本,并且由于 AppleScript 可以完美地处理文本,所以没有人期望它试图将其强制转换为不同的内容;如有必要,这需要由脚本编写者明确完成。
我有一个别名形式的 AppleScript 处理路径并将它们转换为 posix。
这些路径将由 shell 脚本在此自动化工作流程的第二步中处理。
问题是路径包含 spaces.
我不知道如何处理这个,所以我有这个子程序来删除任何 space 并将其替换为 \
。
on replaceChars(this_text, search_string, replacement_string)
set saveTID to AppleScript's text item delimiters
set AppleScript's text item delimiters to the search_string
set the item_list to every text item of this_text
set AppleScript's text item delimiters to the replacement_string
set this_text to the item_list as string
set AppleScript's text item delimiters to saveTID
return this_text
end replaceChars
Applescript 部分是我做的
-- convert the path from the alias form to posix
set fileInputPosix to (the POSIX path of thePath)
-- replace " " with "\ "
set quotedForm to replaceChars(fileInputPosix, space, "\ ")
此时路径似乎没问题,比如
'/Users/myUser/Desktop/my\ video\ file.png'
但是当我将此路径传递给 shell 脚本时,它不会接受。
只需引用shell行中的路径并删除搜索和替换部分
/usr/local/bin/ffmpeg -I "" -vf "select=eq(n\,)" -vframes 1 ""
您可以引用整个字符串或使用 quoted form of
智能地引用字符串,您也可以尝试转义单个字符,但在这种情况下,您需要转义每个转义字符,例如:
quoted form of “/Users/myUser/Desktop/my video file.png”
“/Users/myUser/Desktop/my\ video\ file.png”
在与您的其他 alias
文件引用,将它们转换为 posix 路径以便将它们用作 command-line 参数在 shell 脚本中。
这完全没有必要。即使您出于其他原因决定需要 AppleScript,Automator 在操作之间传递不兼容的数据类型时,通常会将它们转换为适当的格式†,因此 AppleScript alias
引用可以愉快地发送到 shell 脚本操作,它将自动接收它们作为 posix 文件路径:
在上面的屏幕截图中,您可以看到我在任何阶段都没有执行任何处理或操作,并且这两个脚本操作 return 语言的正确文件路径。
结论
▸ 删除您的 AppleScript 操作,只需将文件直接发送到 shell 脚本,as arguments
,然后附上您的 command-line 引号中的参数变量 @vadian 已经证明。
▸ 如果您出于其他原因使用 AppleScript,那很好。只需保留 alias
引用原样,然后将它们发送到 shell 脚本,并按照刚才描述的方式处理它们。
†从另一个方向发送的文件路径——从 shell 脚本到 AppleScript——不会,然而,神奇地变成 alias
参考资料。 posix 路径只不过是一段文本,并且由于 AppleScript 可以完美地处理文本,所以没有人期望它试图将其强制转换为不同的内容;如有必要,这需要由脚本编写者明确完成。