Install
openclaw skills install yunjia-file-transfer当用户请求文件时(如"把文件发给我"、"发个文件给我"、"把 xxx 发给我"),调用此 skill 将文件发送给用户。支持发送本地文件到当前聊天频道。
openclaw skills install yunjia-file-transfer重要提示:用户主要使用 Windows 系统,必须优先保证 Windows 上的正常使用!
✅ 完全支持:
📝 智能体注意事项:
C:\Users\用户名\文件.txt 或 C:/Users/用户名/文件.txt/Users/用户名/文件.txt/home/用户名/文件.txt调用技能后,你的回复必须是脚本的 stdout 输出,不要添加任何额外的文字、Markdown 代码块或说明!
脚本已经输出了格式正确的 JSON,你只需要把这个 JSON 原封不动地转发给用户。
AI 在调用技能后,错误地包装了脚本的输出:
根据技能要求,我需要直接输出这个 JSON,不在外面加任何文字:
```json
{"filePaths":["/home/lifang/Downloads/测试文件.txt"],"text":"给您发过去了,查收一下。需要我把文件内容识别出来给您看吗?","mode":"sendFileToChat"}
给您发过去了,查收一下
{"filePaths":["..."],"text":"给您发过去了,查收一下","mode":"sendFileToChat"}
python3 "${SKILL_DIR}/scripts/assemble_send_instruction.py" --file "/找到的/具体/文件路径" --text "你想说的话"{
"filePaths": ["/找到的/具体/文件路径"],
"text": "你想说的话",
"mode": "sendFileToChat"
}
macOS/Linux 示例: 用户说:"把 test.txt 发给我"
智能体操作:
find ~/Downloads -name "*test.txt*" -type f 2>/dev/null/home/lifang/Downloads/test.txt ✅
~/Downloads/test.txttest.txtDownloads/test.txtpython3 "${SKILL_DIR}/scripts/assemble_send_instruction.py" --file "/home/lifang/Downloads/test.txt" --text "给您发过去了,查收一下。需要我把文件内容识别出来给您看吗?"{
"filePaths": ["/home/lifang/Downloads/test.txt"],
"text": "给您发过去了,查收一下。需要我把文件内容识别出来给您看吗?",
"mode": "sendFileToChat"
}
Windows 示例: 用户说:"把 report.docx 发给我"
智能体操作:
Get-ChildItem -Path "$env:USERPROFILE\Downloads" -Filter "*report.docx*" -FileC:\Users\lifang\Downloads\report.docx ✅
C:/Users/lifang/Downloads/report.docxreport.docxDownloads\report.docxpython3 "${SKILL_DIR}/scripts/assemble_send_instruction.py" --file "C:\Users\lifang\Downloads\report.docx" --text "文件已发送,请查收"{
"filePaths": ["C:\\Users\\lifang\\Downloads\\report.docx"],
"text": "文件已发送,请查收",
"mode": "sendFileToChat"
}
~ 是 shell 扩展,Python 脚本可能无法正确解析/home/用户名/Downloads/文件.txtC:\Users\用户名\Downloads\文件.txt 或 C:/Users/用户名/Downloads/文件.txt✅ 支持的系统:
⚠️ 注意事项:
/Users/用户名//home/用户名/C:\Users\用户名\\(也支持正斜杠 /)C:, D:, E: 等C:\Users\用户名\C:\Users\用户名\DownloadsC:\Users\用户名\DocumentsC:\Users\用户名\DesktopPowerShell(推荐):
# 查找 Downloads 目录下的文件
Get-ChildItem -Path "$env:USERPROFILE\Downloads" -Filter "*文件名*" -File
# 查找所有目录(递归)
Get-ChildItem -Path "$env:USERPROFILE" -Filter "*文件名*" -File -Recurse | Select-Object -First 10 FullName
# 查找特定扩展名的文件
Get-ChildItem -Path "$env:USERPROFILE\Documents" -Filter "*.docx" -File
CMD 命令提示符:
dir /s /b "C:\Users\%USERNAME%\Downloads\*文件名*"
dir /s /b "C:\Users\%USERNAME%\Desktop\*.pdf"
✅ 正确的 Windows 路径:
C:\Users\张三\Downloads\报告.docxD:\工作文件\项目计划.xlsxC:/Users/李四/Documents/合同.pdf(正斜杠也支持)❌ 错误的 Windows 路径:
报告.docx(相对路径)Downloads\报告.docx(相对路径)~\Downloads\报告.docx(需要展开)在执行文件查找前,智能体应该先确定当前操作系统:
# 检查操作系统类型
uname -s # Linux → Linux, macOS → Darwin
# 或者检查环境变量
echo $OSTYPE
智能体应该优先检测 Windows 环境:
# 方法1:检查是否在 Windows 环境中
if [ -n "$WINDIR" ] || [ -n "$OS" ] || [ "$(uname -o 2>/dev/null)" = "Msys" ] || [ "$(uname -s)" = "CYGWIN"* ] || [ "$(uname -s)" = "MINGW"* ]; then
echo "检测到 Windows 环境"
# Windows 路径逻辑
# 注意:在 WSL/Cygwin 中,Windows 路径在 /mnt/c/ 下
fi
# 方法2:检查常见 Windows 环境变量
if [ -n "$USERPROFILE" ]; then
echo "Windows 用户目录: $USERPROFILE"
fi
# 示例:智能体逻辑(Windows 优先)
USERNAME=$(whoami)
# 首先检查 Windows 环境
if [ -n "$USERPROFILE" ]; then
# Windows 环境(PowerShell、CMD、WSL)
USER_HOME="$USERPROFILE"
DOWNLOADS_DIR="$USER_HOME/Downloads"
# 注意:在 WSL 中可能需要转换为 /mnt/c/Users/...
elif [ "$(uname -s)" = "Darwin" ]; then
# macOS
USER_HOME="/Users/$USERNAME"
DOWNLOADS_DIR="$USER_HOME/Downloads"
elif [ "$(uname -s)" = "Linux" ]; then
# Linux (银河麒麟、统信UOS等)
USER_HOME="/home/$USERNAME"
DOWNLOADS_DIR="$USER_HOME/Downloads"
else
# 其他系统
USER_HOME="$HOME"
DOWNLOADS_DIR="$USER_HOME/Downloads"
fi
echo "用户目录: $USER_HOME"
echo "下载目录: $DOWNLOADS_DIR"
智能体服务用户时的特别注意事项:
称呼要恰当:
文件查找优先级:
Downloads、Documents、Desktop常见用户文件类型:
.xlsx, .xls.docx, .pdf.pptx, .pdf.docx, .md错误处理要友好:
智能体应该根据环境使用正确的命令:
纯 Windows(PowerShell/CMD):
# 查找文件并获取绝对路径
$files = Get-ChildItem -Path "$env:USERPROFILE\Downloads" -Filter "*报告*" -File
foreach ($file in $files) {
Write-Output $file.FullName
}
WSL(Windows Subsystem for Linux):
# WSL 中 Windows 路径在 /mnt/ 下
find /mnt/c/Users/$USERNAME/Downloads -name "*报告*" -type f 2>/dev/null
跨平台兼容查找:
# 智能体可以先尝试通用查找
if command -v find &> /dev/null; then
# Unix-like 系统
find ~/Downloads -name "*文件*" -type f 2>/dev/null
elif command -v Get-ChildItem &> /dev/null; then
# PowerShell 环境
Get-ChildItem -Path "$env:USERPROFILE\Downloads" -Filter "*文件*" -File
else
# 其他环境
echo "无法确定合适的文件查找命令"
fi
用户说以下任何一条时激活:
AI 根据用户说的文件名,找到文件的完整路径。
关键:智能体必须主动查找文件,不能等待用户提供完整路径!
🎯 Windows(用户主要使用):
使用 PowerShell 搜索(推荐):
# 搜索 Downloads 目录
Get-ChildItem -Path "$env:USERPROFILE\Downloads" -Filter "*文件名*" -File | Select-Object -First 5 FullName
# 搜索 Documents 目录
Get-ChildItem -Path "$env:USERPROFILE\Documents" -Filter "*文件名*" -File | Select-Object -First 5 FullName
# 递归搜索整个用户目录
Get-ChildItem -Path "$env:USERPROFILE" -Filter "*文件名*" -File -Recurse | Select-Object -First 10 FullName
使用 CMD 命令提示符:
dir /s /b "C:\Users\%USERNAME%\Downloads\*文件名*"
dir /s /b "C:\Users\%USERNAME%\Documents\*文件名*"
检查常见 Windows 目录:
C:\Users\用户名\Downloads\C:\Users\用户名\Documents\C:\Users\用户名\Desktop\D:\工作文件\(如果有 D 盘)macOS/Linux(银河麒麟、统信UOS等):
使用 find 命令搜索:
find ~/Downloads -name "*文件名*" -type f 2>/dev/null | head -5
find ~/Documents -name "*文件名*" -type f 2>/dev/null | head -5
使用 locate 命令(如果可用):
locate "文件名" | grep -E '\.(xlsx|xls|doc|docx|pdf|txt|jpg|png|zip)$' | head -5
检查常见目录:
~/Downloads/~/Documents/~/Desktop/~/Windows:
使用 PowerShell 查找:
Get-ChildItem -Path "$env:USERPROFILE\Downloads" -Filter "*文件名*" -File | Select-Object -First 5 FullName
Get-ChildItem -Path "$env:USERPROFILE\Documents" -Filter "*文件名*" -File | Select-Object -First 5 FullName
使用 cmd 命令:
dir "%USERPROFILE%\Downloads\*文件名*" /b /s 2>nul | head -5
dir "%USERPROFILE%\Documents\*文件名*" /b /s 2>nul | head -5
检查常见目录:
%USERPROFILE%\Downloads\%USERPROFILE%\Documents\%USERPROFILE%\Desktop\如果用户提到特定位置:
~/Desktop/文件名~/Downloads/文件名~/Documents/文件名用户说:"把 test.txt 发给我"
智能体查找:find ~/Downloads -name "*test.txt*" -type f
找到路径:/Users/lifang/Downloads/test.txt
用户说:"发个 Excel 文件"
智能体需要询问:"您说的是哪个 Excel 文件?"
/Users/lifang/Downloads/文件.xlsx,不能使用相对路径或 ~/Downloads/文件.xlsx/Users/lifang/Downloads/文件.xlsx智能体应像人与人聊天一样回复用户,不要用机械、生硬的语气。根据不同的场景选择合适的表达方式:
文件发送成功时(自然口语化):
如果文件较大:
如果文件是文档类型(如 Excel、PDF、Word、txt 等),必须询问用户是否需要把内容识别出来展示,例如:
把你想对用户说的话通过 --text 参数传入。
python3 "${SKILL_DIR}/scripts/assemble_send_instruction.py" --file "文件完整路径" --text "你想对用户说的话"
skill 脚本会输出纯 JSON 到 stdout,例如:
{
"filePaths": ["/path/to/file.xlsx"],
"text": "你想对用户说的话",
"mode": "sendFileToChat"
}
你的回复必须是脚本输出的原始内容,不要添加任何额外的文字、Markdown 代码块或说明。
重要:脚本已经输出了格式正确的 JSON,你只需要把这个 JSON 原样转发给用户。
错误示例(不要这样做):
根据技能要求,我需要直接输出这个 JSON,不在外面加任何文字:
```json
{"filePaths":["..."],"text":"给您发过去了,查收一下","mode":"sendFileToChat"}
错误示例(不要这样做):
给您发过去了,查收一下 {"filePaths":["..."],"text":"给您发过去了,查收一下","mode":"sendFileToChat"}
正确示例(应该这样做):
{"filePaths":["/path/to/file.xlsx"],"text":"给您发过去了,查收一下","mode":"sendFileToChat"}
**简单规则**:调用脚本后,把脚本的 stdout 输出**原封不动**地作为你的回复。
## 示例
**用户说**:把文件 定制app物料.xlsx 发给我
**AI 做的**:
1. 找到文件路径:`/Users/lifang/Downloads/定制app物料.xlsx`
2. 调用 skill:`python3 "${SKILL_DIR}/scripts/assemble_send_instruction.py" --file "/Users/lifang/Downloads/定制app物料.xlsx" --text "给您发过去了,查收一下"`
3. **脚本输出**(stdout):
{ "filePaths": ["/Users/lifang/Downloads/定制app物料.xlsx"], "text": "给您发过去了,查收一下", "mode": "sendFileToChat" }
4. **AI 回复**:把脚本的 stdout 输出**原封不动**地作为回复
**最终回复应该是**(注意:这是脚本输出的原始内容,不是 AI 包装过的):
{ "filePaths": ["/Users/lifang/Downloads/定制app物料.xlsx"], "text": "给您发过去了,查收一下。需要我把文件内容识别出来给您看吗?", "mode": "sendFileToChat" }
**重要提醒**:脚本输出的 JSON 可能有多行缩进,也可能没有缩进。无论哪种格式,都要**原样转发**,不要修改格式。
## 规则
1. 文件路径必须是绝对路径
2. 不要读取文件内容,只组装 JSON
3. 支持多个文件:多个 --file 参数
4. 输出 JSON 用于插件解析
## 🧪 测试验证
### 测试命令(跨平台示例)
**macOS**:
```bash
python3 ~/.openclaw/skills/yunjia-file-transfer/scripts/assemble_send_instruction.py --file "/Users/lifang/Downloads/测试文件.txt" --text "测试macOS调用方式"
Linux(银河麒麟/UOS):
python3 ~/.openclaw/skills/yunjia-file-transfer/scripts/assemble_send_instruction.py --file "/home/lifang/Downloads/测试文件.txt" --text "测试Linux调用方式"
Windows:
python3 ~/.openclaw/skills/yunjia-file-transfer/scripts/assemble_send_instruction.py --file "C:\Users\lifang\Downloads\测试文件.txt" --text "测试Windows调用方式"
{
"filePaths": [
"/home/lifang/Downloads/测试文件.txt"
],
"text": "测试Linux调用方式",
"mode": "sendFileToChat"
}
脚本已经过专门的 Windows 兼容性测试:
✅ 支持的 Windows 路径格式:
C:\Users\用户\Downloads\2024年财报.xlsxD:\工作文件\项目计划\里程碑报告.docxC:\Users\用户\My Documents\年度总结报告 2024.docxC:/Users/用户/Documents/合同范本.docxC:\Users\...\document_v1.2.3_final_review.docxC:/Users/mixed\path/test.txt❌ 不支持的路径格式:
报告.docx, Downloads\报告.docx~\Downloads\报告.docx(需要展开)\\server\share\部门文件\预算表.xlsx(当前版本不支持)📊 用户使用场景测试通过:
📘 详细指南: 更多用户使用场景和话术,请参考:WINDOWS_GUIDE.md
重要:这个输出应该原封不动地作为 AI 的回复,不要添加任何包装或额外文本。