如何在Batch脚本中将目录下的文件夹与文件名分配至不同变量?
实现对应的Windows Batch脚本
我已经帮你写出了完全匹配你Unix脚本功能的Batch脚本,能够读取changed.txt中的每一行路径,提取你需要的三个字段并拼接成逗号分隔的字符串,最终输出和你预期一致的结果。
@echo off setlocal enabledelayedexpansion :: 初始化变量 set "PACKAGE=" set "BRANCH=" set "UPDATEFOLDER=" :: 逐行读取changed.txt文件内容 for /f "delims=" %%x in (changed.txt) do ( :: 提取release/之后的文件名(对应Unix中的sed处理) set "line=%%x" set "filename=!line:*release/=!" :: 去除首尾空格(对应Unix中的sed去空格) for /f "tokens=*" %%a in ("!filename!") do set "filename=%%a" :: 拼接PACKAGE变量 if defined PACKAGE ( set "PACKAGE=!PACKAGE!,!filename!" ) else ( set "PACKAGE=!filename!" ) :: 提取第1个目录(对应Unix中的cut -d "/" -f1) for /f "tokens=1 delims=/" %%b in ("%%x") do set "branch=%%b" :: 拼接BRANCH变量 if defined BRANCH ( set "BRANCH=!BRANCH!,!branch!" ) else ( set "BRANCH=!branch!" ) :: 提取第5个目录(对应Unix中的cut -d "/" -f5) for /f "tokens=5 delims=/" %%d in ("%%x") do set "folder=%%d" :: 拼接UPDATEFOLDER变量 if defined UPDATEFOLDER ( set "UPDATEFOLDER=!UPDATEFOLDER!,!folder!" ) else ( set "UPDATEFOLDER=!folder!" ) ) :: 输出结果 echo PACKAGE is %PACKAGE% echo BRANCH is %BRANCH% echo UPDATEFOLDER is %UPDATEFOLDER% endlocal
关键细节说明
- 延迟变量扩展:启用
setlocal enabledelayedexpansion是Batch处理循环变量的核心——循环内部修改变量后,必须用!var!代替%var%才能读取到实时更新的值。 - 提取release后的文件名:用
!line:*release/=!实现字符串替换,直接砍掉release/之前的所有内容;再用for /f "tokens=*"去除首尾空格,完美对应Unix脚本里的sed去空格操作。 - 提取指定目录字段:用
for /f "tokens=N delims=/"分割路径,tokens=1取第一个目录(branches),tokens=5取第五个目录(ADAdapter),和Unix的cut -d "/" -fN效果完全一致。 - 拼接逗号分隔字符串:每次循环判断变量是否已定义,有值就追加
,新内容,无值则直接赋值,从根源避免了开头出现多余逗号,比Unix最后用sed去逗号的方式更高效。
测试结果
把你的changed.txt放在脚本同目录下运行,会得到和你预期完全一致的输出:
PACKAGE is post_commit_hook.zip,post_commit_hook.zip,post_commit_hook.zip,post_commit_hook.zip BRANCH is branches,branches,branches,branches UPDATEFOLDER is ADAdapter,ADAdapter,ADAdapter,ADAdapter
内容的提问来源于stack exchange,提问作者acroniks
相关产品推荐
相关产品推荐

