Windows环境下使用ProcessBuilder调用git-bash写入文件失败求助
问题场景
我编写了如下代码,尝试通过ProcessBuilder将指定文本写入文件:
val requestStringBody = "{\"transfers\": [{\"amount\": 100, \"name\": \"Steve Rogers\", \"taxId\": \"330.731.970-10\",\"bankCode\": \"001\",\"branchCode\": \"1234\",\"accountNumber\": \"123456-0\"}]}" ProcessBuilder("cmd", "/c", ".\\git-bash.lnk", "-c", "echo -n \"$requestStringBody\" >> message.txt") .directory(File("My Path")) .start() .waitFor()
由于Windows系统相关问题,我使用了git-bash.lnk来执行命令。
我将requestStringBody替换为其他变量时命令可以正常运行,因此判断是该字符串存在问题,但始终无法定位具体原因。
问题原因
报错本质是多层命令转义冲突:
- 你的JSON字符串本身包含大量双引号,拼接进ProcessBuilder的命令参数后,首先会经过Windows cmd的一层转义解析,原本属于JSON内容的双引号会被cmd识别为命令参数的边界,导致传给git bash的命令内容提前被截断、格式错乱
- 即使逃过cmd解析的内容,进入git bash后还要经过shell的二次解析,JSON里的特殊符号会被进一步错误转义,最终要么命令执行失败,要么写入文件的内容和预期不符
解决方案
你最终使用的File(fileName).writeText(fileContent)是最优方案:
- 直接通过JDK的文件IO接口写入内容,完全绕开了shell命令的多层转义逻辑,没有格式错乱风险
- 相比启动额外进程执行写入的方式,IO直接写入的性能、可靠性都高很多,也不需要依赖git bash这类外部环境
更新:我最终通过
File(fileName).writeText(fileContent)方法解决了该问题。
内容的提问来源于stack exchange,提问作者Felipe Tomao
相关产品推荐
相关产品推荐

