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.

所以这似乎不起作用,我无法弄清楚我做错了什么。我对批处理脚本相当陌生,因此感谢您的帮助

4

2 回答 2

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 语句。

于 2012-04-17T17:51:23.080 回答
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 ""

如您所见,您的第 2 部分完全失败。

于 2012-04-17T17:00:42.483 回答