2012-04-17 57 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部分完全地失敗。

相關問題