You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy脚本在FileMaker中无输出?FTP连接脚本排查求助

排查Groovy FTP脚本在FileMaker中无输出无错误的问题

我来帮你一步步拆解这个问题——你的脚本没输出也没报错,大概率是输出捕获、异常处理、代码完整性或者依赖配置出了问题,我们挨个解决:

1. 先修复代码的语法与完整性问题

你的代码最后ftpClient.fileType=(FTPClien...明显是截断了,而且类名写错了(应该是FTPClient不是FTPClien)。先给你补全一个带异常处理的完整基础脚本:

import org.apache.commons.net.ftp.FTPClient
import java.util.Arrays

def start() {
    def ftpClient = new FTPClient()
    try {
        // 建立连接
        ftpClient.connect("172.17.5.105")
        println("连接后服务器回复:${ftpClient.replyString}")
        
        // 启用被动模式(解决大部分防火墙/ NAT下的连接问题)
        ftpClient.enterLocalPassiveMode()
        
        // 登录FTP服务器
        boolean loginSuccess = ftpClient.login("FTPUser","Santosh@123")
        println("登录后服务器回复:${ftpClient.replyString},登录状态:${loginSuccess}")
        
        // 切换到根目录
        boolean dirChanged = ftpClient.changeWorkingDirectory("/")
        println("切换目录后服务器回复:${ftpClient.replyString},切换状态:${dirChanged}")
        
        // 补全文件类型设置(比如二进制类型,避免传输文件时损坏)
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE)
        println("设置文件类型后服务器回复:${ftpClient.replyString}")
        
        // 测试获取目录列表,验证连接有效性
        String[] files = ftpClient.listNames()
        if(files != null) {
            println("目录文件列表:${Arrays.toString(files)}")
        } else {
            println("无法获取文件列表,服务器回复:${ftpClient.replyString}")
        }
        
    } catch (Exception e) {
        // 关键!捕获所有异常,不然FileMaker会悄悄吞掉错误
        println("脚本执行异常:${e.getMessage()}")
        e.printStackTrace()
    } finally {
        // 确保连接被正确关闭,避免资源泄漏
        if(ftpClient.isConnected()) {
            try {
                ftpClient.logout()
                ftpClient.disconnect()
                println("FTP连接已成功关闭")
            } catch (Exception e) {
                println("关闭连接时异常:${e.getMessage()}")
            }
        }
    }
}

start()

2. 解决FileMaker的输出捕获问题

在FileMaker里,println的输出不会直接显示在界面上——FileMaker不会自动捕获控制台输出。你需要把所有输出内容拼接成字符串,通过返回值传递给FileMaker,然后在FileMaker里用字段或对话框显示结果:

import org.apache.commons.net.ftp.FTPClient
import java.util.Arrays
import java.io.StringWriter
import java.io.PrintWriter

def start() {
    // 用StringBuilder拼接所有输出结果
    def result = new StringBuilder()
    def ftpClient = new FTPClient()
    
    try {
        ftpClient.connect("172.17.5.105")
        result.append("连接后服务器回复:${ftpClient.replyString}\n")
        
        ftpClient.enterLocalPassiveMode()
        
        boolean loginSuccess = ftpClient.login("FTPUser","Santosh@123")
        result.append("登录后服务器回复:${ftpClient.replyString},登录状态:${loginSuccess}\n")
        
        boolean dirChanged = ftpClient.changeWorkingDirectory("/")
        result.append("切换目录后服务器回复:${ftpClient.replyString},切换状态:${dirChanged}\n")
        
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE)
        result.append("设置文件类型后服务器回复:${ftpClient.replyString}\n")
        
        String[] files = ftpClient.listNames()
        if(files != null) {
            result.append("目录文件列表:${Arrays.toString(files)}\n")
        } else {
            result.append("无法获取文件列表,服务器回复:${ftpClient.replyString}\n")
        }
        
    } catch (Exception e) {
        result.append("脚本执行异常:${e.getMessage()}\n")
        // 把堆栈信息也加入结果,方便排查深层问题
        StringWriter sw = new StringWriter()
        e.printStackTrace(new PrintWriter(sw))
        result.append("异常堆栈信息:${sw.toString()}\n")
    } finally {
        if(ftpClient.isConnected()) {
            try {
                ftpClient.logout()
                ftpClient.disconnect()
                result.append("FTP连接已成功关闭\n")
            } catch (Exception e) {
                result.append("关闭连接时异常:${e.getMessage()}\n")
            }
        }
    }
    
    // 返回结果给FileMaker
    return result.toString()
}

// 调用脚本并返回结果,让FileMaker能捕获
return start()

之后在FileMaker中,运行这个脚本时,把返回值赋值给一个文本字段,或者用Show Custom Dialog直接显示返回的字符串,这样就能看到所有输出和错误信息了。

3. 检查依赖库是否正确配置

你的脚本依赖Apache Commons Net库(org.apache.commons.net.ftp.FTPClient),必须确保:

  • 已经把commons-net-x.x.x.jar(比如最新的commons-net-3.9.0.jar)放到FileMaker能加载的路径中,比如FileMaker的插件目录、指定的lib文件夹,或者Groovy插件的依赖目录
  • 如果使用的是FileMaker的Groovy插件(比如GroovyFM),要确认插件已经正确安装并启用,且插件包含了所需的commons-net依赖

4. 网络与权限的基础检查

  • 确认运行FileMaker的机器能ping通172.17.5.105,且FTP默认端口21没有被本地或服务器的防火墙拦截
  • 验证FTP账号FTPUser的密码Santosh@123是否正确,且该账号拥有访问根目录/的权限
  • 被动模式的端口范围(通常是1024-65535)是否被服务器防火墙允许——enterLocalPassiveMode()会使用被动模式,需要服务器开放这些端口

5. 实用调试技巧

  • 在FileMaker中启用脚本调试模式,逐步执行脚本,查看每一步的返回值变化
  • 先在本地Groovy控制台(比如Groovy Console工具)中运行脚本,确认脚本本身能正常工作,再放到FileMaker中测试——这样可以排除FileMaker环境的问题
  • 把关键步骤的结果写入FileMaker的日志字段,而不是依赖控制台输出

内容的提问来源于stack exchange,提问作者Raj s

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:55:15