我有一个包含两行的文本文件(比如param.txt),如下所示:
Mar2012
dim1,dim2,dim3,dim4
我想批量读取此文件,并将第一行的内容存储在名为cube_name的变量中。当我读第二行时,我想分割逗号分隔的字符串dim1,dim2,dim3,dim4并创建一个包含四个元素的数组。我打算在脚本的后面部分使用变量和数组。
我创建的代码如下所示。代码未按预期工作。
@echo off & setlocal enableextensions enabledelayedexpansion
set /a count_=0
for /f "tokens=*" %%a in ('type param.txt') do (
set /a count_+=1
set my_arr[!count_!]=%%a
)
set /a count=0
for %%i in (%my_arr%) do (
set /a count+=1
if !count! EQU 1 (
set cube_name=%%i
)
if !count! GTR 1 (
set dim_arr=%%i:@=,%
)
)
for %%i in (%dim_arr%) do (
echo %%i
)
echo !cube_name!
运行代码时,我会看到以下内容:
C:\Working folder>test2.bat
ECHO is off.
所以这似乎不起作用,我无法弄清楚我做错了什么。我是批处理脚本的新手,所以非常感谢帮助
答案 0 :(得分:3)
你的第一个FOR循环没问题。这不是我会怎么做,但它的工作原理。之后的一切都是一团糟。看起来你认为数组是批量的正式概念,当它们不是时。可以以看起来让人联想到数组的方式处理变量。但批量中不存在真正的数组。
您使用%my_arr%就像它是一个数组一样,但是甚至没有定义 my_arr 。您已定义变量 my_arr [1] amd my_arr [2] - 括号和数字是变量名称的一部分。
看起来你对FOR循环有误解。我建议你仔细阅读FOR文档(从命令行输入HELP FOR
)。另请查看此站点和其他站点上的示例。 FOR命令非常复杂,因为它有许多看起来类似于未经训练的眼睛的变化,但具有截然不同的行为。帮助您理解的一个很好的资源是http://judago.webs.com/batchforloops.htm
假设文件总是有两行,我会解决你的问题
@echo off
setlocal enableDelayedExpansion
set dimCnt=0
<param.txt (
set /p "cube_name=" >nul
set /p "dimList=" >nul
for %%D in (!dimList!) do (
set /a dimCnt+=1
set "dim[!dimCnt!]=%%D"
)
)
echo cube_name=!cube_name!
for /l %%I in (1 1 !dimCnt!) do echo dim[%%I]=!dim[%%I]!
上述解决方案的一个很好的特点是它允许在第二行的维度列表中使用不同数量的术语。如果维度名称中有制表符,空格,分号,等号*
或?
,则会失败。如果需要,有相对简单的方法来解决这个限制。
可以使用搜索和替换来处理制表符,空格,分号和相等,以将每个术语括在引号中。
for %%D in ("!dimList:,=","!") do (
set /a dimCnt+=1
set "dim[!dimCnt!]=%%~D"
)
我不会在这里发布完整的解决方案,因为它不太可能需要。但是处理*
和/或?
将需要用换行符替换逗号并切换到FOR / F语句。
答案 1 :(得分:1)
我对你的代码印象深刻!
您是否尝试调试或回显任何内容?
您可以简单地添加一些回声来查看代码无法正常工作的原因。
@echo off & setlocal enableextensions enabledelayedexpansion
set /a count_=0
for /f "tokens=*" %%a in ('type param.txt') do (
set /a count_+=1
set my_arr[!count_!]=%%a
)
echo ### show the variable(s) beginning with my_arr...
set my_arr
echo Part 2----
set /a count=0
echo The value of my_arr is "%my_arr%"
for %%i in (%my_arr%) do (
set /a count+=1
echo ## Count=!count!, content is %%i
if !count! EQU 1 (
set cube_name=%%i
)
if !count! GTR 1 (
echo ## Setting dim_arr to "%%i:@=,%"
set dim_arr=%%i:@=,%
echo
)
)
for %%i in (%dim_arr%) do (
echo the value of dim_arr is "%%i"
)
echo cube_name is "!cube_name!"
输出
### show the variable(s) beginning with my_arr...
my_arr[1]=Mar2012
my_arr[2]=dim1,dim2,dim3,dim4
Part 2----
The value of my_arr is ""
cube_name is ""
你可以看到你的part2完全失败了。