使用smugcli批量上传图片至SmugMug时,创建含特殊字符的相册出现409冲突错误
看起来你遇到的问题核心是Batch脚本里的特殊字符(比如&)在传递给smugcli时没有被正确处理,导致SmugMug API收到的相册名称不完整,进而返回409冲突错误——既找不到相册,又创建失败。我来帮你梳理下解决思路和具体修改方案:
一、先修复Batch脚本的参数传递问题
原脚本里调用smugcli时,%combined_path%中的&会被Batch当作命令分隔符拆分,导致实际传递给smugcli的参数只有Photobooths\2023\1604-RAY,后面的&被当成了新命令执行。你需要做两个关键修改:
用引号完整包裹路径参数
修改调用smugcli的两行代码,把路径用双引号包起来,避免Batch拆分参数:python -m smugcli mkalbum "%combined_path%" python -m smugcli upload "%WD_FILE%" "%combined_path%"正确转义变量中的特殊字符
在设置MYDIR2之后,用延迟变量语法转义&字符:setlocal enableDelayedExpansion FOR /f "tokens=4 delims=\" %%a IN ("%MYDIR%") do set MYDIR2=%%a set "MYDIR2=!MYDIR2:&=^&!"这样能确保
&在Batch中被正确识别为普通字符,不会被当作命令分隔符。
二、改用Python脚本替代Batch(更稳定的长期方案)
Batch的特殊字符处理一直是个坑,不如直接写个简单的Python脚本来接收WatchDirectory的变量,然后直接调用smugcli的内部API,彻底绕开命令行转义的麻烦:
新建一个Python脚本(比如
smug_upload.py):import os import sys from smugcli.smugcli import run def main(): # 接收WatchDirectory传递的文件路径和目标目录名 file_path = sys.argv[1] album_subdir = sys.argv[2] # 拼接完整的相册路径 full_album_path = os.path.join("Photobooths/2023", album_subdir) # 创建相册 run(["mkalbum", full_album_path]) # 上传图片 run(["upload", file_path, full_album_path]) if __name__ == "__main__": main()修改你的Batch脚本,改为调用这个Python脚本:
@echo off setlocal enableDelayedExpansion set "MYDIR=%WD_FILE_D%" FOR /f "tokens=4 delims=\" %%a IN ("%MYDIR%") do set MYDIR2=%%a python smug_upload.py "%WD_FILE%" "!MYDIR2!" pause这种方式直接在Python内部处理路径和调用逻辑,完全避免了Batch的转义问题,稳定性会高很多。
三、额外排查:确认SmugMug对特殊字符的支持
如果上面的方法还是报错,可能是SmugMug本身不允许相册名称包含&这类特殊字符,或者需要进行URL编码。你可以尝试在Python脚本中对相册名称进行URL编码后再传递:
import urllib.parse encoded_subdir = urllib.parse.quote(album_subdir) full_album_path = os.path.join("Photobooths/2023", encoded_subdir)
不过需要注意,要先确认smugcli是否支持编码后的路径格式。
备注:内容来源于stack exchange,提问作者BertW

