batch-file - 使用移位在for循环内批量解析传入参数
问题描述
我正在尝试编写“引导程序”脚本来解析并将参数传递到我框架中的其他应用程序中。下面这个最小的、可重现的例子,实际应用要复杂得多
该脚本的基本语法是
bootstrapper.bat type command "foo=1" "bar=test2" "baz=true"
它应该调用
type/command.bat 1 test2 true
有问题的片段是这个嵌套的 for 循环:
setlocal enabledelayedexpansion
rem this is actually fetched elsewhere in live app
set procedure_arguments_count=3
set arguments=
for /L %%L in (1,1,!procedure_arguments_count!) do (
for /f "tokens=1,2 delims==" %%a in ("%~3") do set arguments=!arguments! %%b
shift /3
)
echo !arguments!
问题是arguments
等于1 1 1
而不是1 test2 true
在执行此循环之后。
我相信内部循环预先填充了%~3
设置为foo=1
并忽略了 shift 命令。我无法更改shift
,因为我需要支持 9 个以上的参数,也无法删除外循环(出于其他原因)。
问题是 - 我可以延迟扩展脚本参数吗?
解决方案
您的问题是,即使在循环执行之前,%x
参数也会被解析器替换为初始值,因此在循环内没有(立即)影响。for
shift
for
一个简单的解决方法:将参数 3....n 分配给一个变量并处理:
setlocal enabledelayedexpansion
for /f "usebackq tokens=2,*" %%i in ('%*') do (
for %%k in (%%j) do (
for /f "tokens=2 delims==" %%a in ("%%~k") do (
set "args=!args! %%~a"
)
)
)
set args
第一个为for
您获取参数 3...
第二个for
处理您剩余的每个参数
第三个for
从每个var=value
字符串中获取值。
推荐阅读
- winapi - vulkan 可以与直接合成进行互操作以实现窗口背景模糊效果吗?
- curl - 计算和评估 Hp prime 中的卷曲
- flutter - flutter web oauth无法读取令牌
- python - 贝尔曼福特的打印路径
- java - 使用 Java 创建 Websocket 拦截器/操纵器
- python - 将 JSON 反序列化为 Python 对象并稍后再次序列化(JSON 包含键“类”)
- pandas - 在 Pandas 中熔化列分组
- flutter - 图像资源在 Web 上加载良好,但在移动设备上不加载
- android - 在将数据从片段传递到活动时,存在或不存在接口有什么区别?
- swift - 更新可可豆荚后没有 Googlesheets API 命令工作