AppleScript调用Terminal处理批量文件复制时遇类型转换错误求助
解决AppleScript调用Terminal命令获取输出的类型错误问题
错误原因
你遇到的Can’t make «class ttab» ... into type list or string错误,是因为Terminal的do script命令返回的是终端标签页对象,而非命令执行后的文本输出。你试图直接对这个对象使用starts with字符串判断,自然会触发类型转换失败。
推荐解决方案(两种思路)
方案一:纯AppleScript实现文件匹配(无需依赖Terminal)
直接通过Finder对象模型查找符合条件的文件,更高效且避免Terminal交互问题:
set theSheetAlias to choose file with prompt "请选择电子表格文件。" of type {"public.spreadsheet"} set theSourceAlias to choose folder with prompt "请选择照片所在的文件夹。" tell application "Microsoft Excel" activate open alias theSheetAlias set theSheet to active sheet set lastRow to count of rows of theSheet's used range -- 遍历数据行(跳过表头第1行) repeat with i from 2 to lastRow set theStyle to value of cell 2 of row i of theSheet -- 跳过空值行 if theStyle is not missing value and theStyle is not "" then set matchedFiles to {} -- 查找包含指定关键词的文件 tell application "Finder" repeat with aFile in files of folder theSourceAlias if name of aFile contains theStyle then set end of matchedFiles to aFile end if end repeat end tell if matchedFiles is {} then -- 无匹配文件时执行的逻辑 display dialog "未找到包含「" & theStyle & "」的文件" else -- 匹配到文件时执行复制逻辑 repeat with targetFile in matchedFiles -- 示例:复制到桌面,可替换为你的目标路径 duplicate targetFile to folder (path to desktop folder) end repeat end if end if end repeat end tell
方案二:用do shell script执行命令(替代Terminal操作)
如果偏好使用shell命令,可直接用AppleScript自带的do shell script(该命令会返回命令输出文本,无需操作Terminal窗口):
set theSheetAlias to choose file with prompt "请选择电子表格文件。" of type {"public.spreadsheet"} set theSourceAlias to choose folder with prompt "请选择照片所在的文件夹。" set theSourcePath to quoted form of POSIX path of theSourceAlias tell application "Microsoft Excel" activate open alias theSheetAlias set theSheet to active sheet set lastRow to count of rows of theSheet's used range repeat with i from 2 to lastRow set theStyle to value of cell 2 of row i of theSheet if theStyle is not missing value and theStyle is not "" then try -- 执行ls命令获取匹配文件列表 set searchResult to do shell script "cd " & theSourcePath & "; ls -1 *" & quoted form of theStyle & "*" -- 将输出按行拆分为文件列表 set matchedFiles to paragraphs of searchResult -- 执行复制逻辑 repeat with fileName in matchedFiles set sourceFile to theSourcePath & "/" & fileName -- 示例:复制到桌面,替换为你的目标路径 do shell script "cp " & quoted form of sourceFile & " " & quoted form of POSIX path of (path to desktop folder) end repeat on error errMsg -- 捕获无匹配的错误 if errMsg contains "zsh: no matches" then display dialog "未找到包含「" & theStyle & "」的文件" else -- 处理其他意外错误 display dialog "执行出错:" & errMsg end if end try end if end repeat end tell
内容的提问来源于stack exchange,提问作者Sievert
相关产品推荐
相关产品推荐

