Windows批处理脚本:如何传递匹配*.zipped.*的文件给offzip工具
解决Windows批处理传递*.zipped.*文件给offzip的问题
嘿,我来帮你修正并完善这个批处理脚本!你的思路方向是对的,但原脚本里有几个语法细节需要调整,尤其是变量延迟扩展和字符串截取的部分。
先说说原脚本的问题:
- 未启用延迟变量扩展:在
FOR循环内部使用!变量!的语法时,必须先开启延迟扩展,否则变量值无法实时更新 - 字符串截取语法错误:
!file_name:~end,end-7!是无效写法,批处理中要截取到倒数第N个字符,正确格式是!变量:~0,-N! - 冗余变量定义:其实不用额外声明
file_name,直接用批处理自带的文件变量修饰符会更高效
修正后的完整脚本:
@echo off setlocal enabledelayedexpansion :: 递归遍历当前目录及所有子目录下的*.zipped.*文件 for /r "%CD%" %%I in (*.zipped.*) do ( :: 提取文件名(不含路径和扩展名),去掉末尾的".zipped"(共7个字符) set "base_name=%%~nI" set "output_name=!base_name:~0,-7!%%~xI" :: 调用offzip工具,传入原文件路径和处理后的输出文件名 offzip "%%I" "!output_name!" ) endlocal
脚本关键部分解释:
@echo off:关闭命令行的命令回显,让输出更整洁setlocal enabledelayedexpansion:启用延迟变量扩展,确保循环内部的变量能实时获取最新值for /r "%CD%" %%I in (*.zipped.*):递归遍历当前目录(%CD%代表当前工作目录)下所有匹配*.zipped.*规则的文件,%%I指代每个匹配到的完整文件路径%%~nI:提取%%I对应的纯文件名(不含路径和扩展名),比如D:\demo\test.zipped.txt会被提取为test.zipped!base_name:~0,-7!:截取base_name从开头到倒数第7个字符之前的内容(.zipped正好是7个字符),所以test.zipped会变成test%%~xI:提取%%I对应的文件扩展名(带点),比如.txtoffzip "%%I" "!output_name!":调用你的offzip工具,传入原始文件路径和拼接好的目标文件名
极简版(省去中间变量):
如果想让脚本更紧凑,也可以直接在调用命令里拼接参数,省去临时变量:
@echo off setlocal enabledelayedexpansion for /r "%CD%" %%I in (*.zipped.*) do ( set "name=%%~nI" offzip "%%I" "!name:~0,-7!%%~xI" ) endlocal
这样就能准确把所有符合*.zipped.*模式的文件传递给offzip工具啦!
内容的提问来源于stack exchange,提问作者DumbStudent2016
相关产品推荐
相关产品推荐

