Sourcetree自定义动作多选文件时$FILE仅传单个的解决方法
Sourcetree自定义动作获取多选中文件路径的调整方案
问题根因
Sourcetree对$FILE参数的多值传递逻辑,不是将所有选中文件路径拼接为单个字符串传入,而是按照选中顺序,把每个文件的路径作为独立的命令行参数依次追加在命令后。原有批处理代码中写死%2取第二个参数,自然只能拿到第一个被选中的文件路径。
具体调整步骤
1. 修改批处理文件的参数接收逻辑
批处理中%1对应$REPO传入的仓库根路径,从%2开始的所有参数都是选中的文件路径,需要遍历收集所有后续参数,同时兼容路径带空格的场景,替换原有批处理代码为如下内容:
@echo off setlocal enabledelayedexpansion :: 读取第一个参数作为仓库路径 set "REPO_PATH=%~1" shift :: 遍历收集后续所有文件路径参数 set "ALL_FILES=" :collect_files if "%~1"=="" goto run_python set "ALL_FILES=!ALL_FILES! "%~1"" shift goto collect_files :run_python :: 传入仓库路径和全量文件路径调用Python脚本 call "<你的Python解释器绝对路径>" "...\myFile.py" --repo="%REPO_PATH%" %ALL_FILES%
2. 调整Python脚本的参数解析规则
不要将--file参数设置为接收单个值,改为接收多个位置参数,以常用的argparse库为例,参考如下写法:
import argparse parser = argparse.ArgumentParser() parser.add_argument('--repo', required=True, help='仓库根目录路径') # 关键配置:nargs='+' 表示接收1个及以上的文件路径参数,自动生成列表 parser.add_argument('--file', required=True, nargs='+', help='选中的文件路径列表') args = parser.parse_args() # args.file 即为所有选中文件的路径列表,可直接遍历执行业务逻辑 for f in args.file: # 替换为你的实际处理逻辑 print(f"处理文件: {f}")
配置注意事项
- Sourcetree自定义动作的参数栏直接按顺序填写
$REPO $FILE即可,不需要手动给参数加引号,Sourcetree会自动处理带空格路径的转义,手动加引号反而会导致多参数拆分失败。 - 如果你的Python脚本需要固定格式的文件路径入参,也可以在批处理中把收集到的文件路径按指定分隔符拼接为单个字符串传入,再在Python中拆分即可,可按需调整灵活性。
内容的提问来源于stack exchange,提问作者jdcas23
相关产品推荐
相关产品推荐

