【问题标题】:Windows CMD Batch: concatenating variable NAME in a loopWindows CMD Batch:在循环中连接变量 NAME
【发布时间】:2017-03-20 17:08:19
【问题描述】:

在 Windows CMD 批处理循环中,我想使用动态变量:list1、list2 和 list3,其中数字 1-3 是动态的(即:list&i),但我正在努力:

setlocal enabledelayedexpansion enableextensions
SET threads=3
set i=1

for /R %%x in (*.jpg) do  ( call set LISTNAME=LIST!i! & SET LIST!i!=!LISTNAME! "%%x" & set /A i=!i!+1  & if !i! gtr %threads% (set i=1))

echo "first" %LIST1%
echo "second" %LIST2%
echo "third" %LIST3%

我挣扎的确切位置是:

SET LIST!i!=!LISTNAME! "%%x" 

例如,我希望它在哪里:

SET LIST1=!LIST1! "%%x"

但是,listname 只是转换为字符串 LIST1,而不是变量 LIST1。 我也试过没有成功:

SET LIST!i!=!LIST!i!! "%%x"

脚本的目的:将 JPG 文件名放在 3 个列表中 编辑以回答第一条评论:文件名以循环方式分布并用空格分隔。

【问题讨论】:

  • 您希望如何分配列表中的图片?循环赛?列表中的文件名应该如何分隔,一个空格?如果您已经将命令括在括号中,则无需将它们保留在一行中。with &
  • 使用CALL SET LIST!i!=%%LIST!i!%% "%%x"FOR /F %%i in ("!i!") DO SET LIST%%i=!LIST%%i! "%%x"。此管理在this answer 进行了解释
  • 感谢 Aacini:这非常有用,尤其是 !LIST%%i!我使用它与下面 LotPings 的答案结合使用以递归显示列表。

标签: windows batch-file cmd


【解决方案1】:

假设循环分布,您可以通过模数计算轻松获得列表编号。出于演示目的,我只输出 filename.ext 而没有 drive:path。

@Echo off
setlocal enabledelayedexpansion enableextensions
Set /A "threads=3,i=0"
:: initialize List
For /L %%n in (1,1,%threads%) Do Set "List%%n="

for /R %%x in (*.jpg) do  ( 
  Set /A "n=i %% threads + 1,i+=1"
  for %%n in (!n!) do Set "List%%n=!List%%n! %%~nxx"
  rem call set "LIST!n!=%%LIST!n!%% %%~nxx"
)
echo "first " %LIST1%
echo "second" %LIST2%
echo "third " %LIST3%

样本输出

"first "  watch_dogs1.jpg watch_dogs4.jpg watch_dogs7.jpg
"second"  watch_dogs2.jpg watch_dogs5.jpg watch_dogs8.jpg
"third "  watch_dogs3.jpg watch_dogs6.jpg watch_dogs9.jpg

EDIT插入了延迟扩展的for变量类型。

【讨论】:

  • 非常优雅!所以诀窍是在 SET 和 %%LIST!n!%% 之外使用“Call”。我从你的代码中学到了很多东西!
  • 批处理更多年我想记住我仍然在这里学习 SO,感谢 @Aacini 与 for 的扩展。
猜你喜欢
  • 2021-06-13
  • 2012-07-24
  • 1970-01-01
  • 2020-03-10
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 2017-02-24
相关资源
最近更新 更多