2012-04-17 59 views
2

我有一个文本文件,两行(说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. 

因此,这似乎并没有工作,我想不出我做错了什么。我对批处理脚本相当陌生,所以帮助表示赞赏

回答

3

您的第一个FOR循环是可以的。这不是我将如何做,但它的工作原理。之后的一切都是一团糟。看起来你认为数组是一个批量形式的概念,当它们不是时。可以用看起来像数组的方式来处理变量。但是真正的数组在批处理中不存在。

您使用%my_arr%,就好像它是一个数组,但my_arr甚至没有定义。你已经定义了变量my_arr [1] amd my_arr [2] - 括号和数字是变量名称的一部分。

它也看起来像你有一个FOR循环的误解。我建议你仔细阅读FOR文档(从命令行输入HELP FOR)。也看看这个和其他网站的例子。 FOR命令非常复杂,因为它有许多与未经训练的眼睛相似的变体,但却有着截然不同的行为。一个很好的资源,以帮助您的理解是http://judago.webs.com/batchforloops.htm


假设文件始终正好具有2行,我会解决你的问题,像这样

@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

令我印象深刻的是您的代码!
您是否尝试调试或回应其中的任何内容?

您可以简单地添加一些echo来查看代码无法工作的原因。

@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 "" 

正如你可以看到你的第2部分完全地失败。

相关问题