2

以下に示す2行のテキストファイル(param.txtなど)があります。

Mar2012
dim1,dim2,dim3,dim4

このファイルをバッチで読み取り、最初の行の内容を cube_name という変数に格納します。2 行目を読んでいるときに、カンマ区切りの文字列 dim1,dim2,dim3,dim4 を分割し、4 つの要素の配列を作成したいと考えています。スクリプトの後半で変数と配列を使用する予定です。

私が作成したコードを以下に示します。コードが期待どおりに機能しません。

@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]と my_arr [2]を定義しました。括弧と数字は変数名の一部です。

また、FOR ループについて誤解しているようです。FOR のドキュメント (HELP FORコマンド ラインから入力) を注意深く読むことをお勧めします。このサイトや他のサイトの例も見てください。FOR コマンドは非常に複雑です。慣れていない人には同じように見えますが、まったく異なる動作をする多くのバリエーションがあるからです。理解に役立つ優れたリソースの 1 つは、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]!

上記のソリューションの優れた機能の 1 つは、2 行目のディメンションのリストでさまざまな数の用語を使用できることです。タブ、スペース、セミコロン、等号、*または?ディメンション名に含まれていると失敗します。必要に応じて、この制限を回避する比較的簡単な方法があります。

タブ、スペース、セミコロン、等号は、検索と置換を使用して各用語を引用符で囲むことで処理できます。

  for %%D in ("!dimList:,=","!") do (
    set /a dimCnt+=1
    set "dim[!dimCnt!]=%%~D"
  )

完全なソリューションは必要ない可能性が高いため、ここには掲載しません。ただし*、and/or?を処理するには、カンマを改行文字に置き換え、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 ""

ご覧のとおり、part2 は完全に失敗します。

于 2012-04-17T17:00:42.483 に答える